This project allows you to use DevExtreme Widgets as Vue Components.
- Getting Started
- API Reference
- Component Configuration
- Type Checks
- DevExtreme Data Layer and Utils
- License
- Support & Feedback
You can try this live example (no need to install anything).
See the sections below if you prefer using a local development environment.
Node.js and npm are required
Install the devextreme and devextreme-vue npm packages:
npm install --save [email protected] devextreme-vue
Import DevExtreme modules in a DevExtreme component's file.
import { DxButton } from 'devextreme-vue';
DevExtreme themes can be imported only once in your application's main file:
import 'devextreme/dist/css/dx.common.css';
import 'devextreme/dist/css/dx.light.compact.css';
See the Predefined Themes guide for more information on DevExtreme themes.
You can use DevExtreme components in a single file component...
<template>
<dx-button :text='text'/>
</template>
<script>
import { DxButton } from 'devextreme-vue';
export default {
name: 'HelloWorld',
data() {
return {
text: 'Hello!'
};
},
components: {
DxButton
}
};
</script>
... in a jsx render function
import Vue from 'vue';
import { DxButton } from 'devextreme-vue';
new Vue({
el: '#app',
data: function() {
return {
text: "Hello!"
}
},
render: function(h) {
return (
<DxButton text={this.text} />
)
}
});
... or directly in a vue template
new Vue({
el: '#app',
components: { DxButton },
template: '<dx-button :text="text" />',
data() {
return {
text: 'Hello!'
};
}
});
DevExtreme Vue components are similar to the DevExtreme JavaScript API but use Vue syntax for specifying widget options, subscribing to events and custom template declaration.
- A constant string value (for example, the Button text):
<dx-button text="Simple button" />
- A constant non-string value (for example, the CheckBox value):
<dx-check-box :value="true" />
- A value from a component data:
<dx-button :text="text" />
where :
is a shorthand for v-bind
directive.
Use the sync
modifier to bind a bindingProperty
to a widget option:
<dx-text-box :value.sync="bindingProperty" />
The DevExtreme Vue editors also support v-model
directive that creates two-way binding on the editor's value (for example, TextBox value):
<dx-text-box v-model="text" />
You can customize widget elements' appearance via the corresponding template properties.
To specify a DevExtreme Vue Component template, use a named slot to specify a template's markup. You also should specify a slot scope to access the template element's data.
For instance, you can specify the itemTemplate:
<div id="app">
<dx-list :items="items">
<div slot="item" slot-scope="data">
<i>This is my template for {{data}}</i>
</div>
</dx-list>
</div>
import Vue from 'vue';
import { DxList } from 'devextreme-vue';
new Vue({
el: '#app',
components: { DxList },
data() {
return {
items: [1, 2, 3, 4]
};
}
});
item
is the default template name of the dxList widget's itemTemplate
option. You can specify a custom name for the itemTemplate
option and for your slot
:
<div id="app">
<dx-list :items="items" item-template="my-template">
<div slot="my-template" slot-scope="data">
<i>This is my template for {{data}}</i>
</div>
</dx-list>
</div>
In addition to using templates, you can put the following widgets' content directly into the markup: Resizable, ScrollView, ValidationGroup. For instance, you can specify the ScrollView widget's content as follows:
<dx-scroll-view>
<div>Some scrollable content</div>
</dx-scroll-view>
You can subscribe to DevExtreme Component Events using the Vue's v-on
directive (or @
shorthand)
<dx-text-box v-model="text" @focusIn="handleFocusIn'" />
data: function() {
return {
text: "text",
handleFocusIn: () => {
this.text = 'focused!';
}
};
}
You can find the full list of component events in each DevExtreme widget API Reference's Events section (for example, TextBox events).
A widget instance is used when calling a widget method. You can get it in the following way:
- Assign a unique key to the component's
ref
attribute. - Use this key to retrieve the component from the
$refs
property. - Use the component's
instance
property to get the widget instance.
<template>
<div title="Accessing Widget Instance">
<dx-text-box :ref="textBoxRefName"/>
<br/>
<dx-button text="Set focus" @click="setFocus"/>
</div>
</template>
<script>
import { DxButton, DxTextBox } from "devextreme-vue";
const textBoxRefName = "some-ref-name";
export default {
data: function() {
return {
textBoxRefName
};
},
components: {
DxTextBox,
DxButton
},
methods: {
setFocus: function() {
this.textBox.focus();
}
},
computed: {
textBox: function() {
return this.$refs[textBoxRefName].instance;
}
}
};
</script>
You should specify proper values for the components' properties because DevExtreme Vue components use Prop Validation and Type Checks. Otherwise, Vue produces a console warning (if you are using the development build).
The DevExtreme includes a Data Layer and Utils that can be helpful in different scenarios.
DevExtreme Vue components are released as an MIT-licensed (free and open-source) DevExtreme add-on.
See the DevExtreme License for more information.
- Check the Vue Guide for general Vue questions
- For questions regarding DevExtreme libraries and widgets' APIs, use the DevExpress Support Center