Вы можете использовать библиотеку Webix при разработке на Vue JS.
Ресурсы для интеграции Webix и Vue не входят в стандартный пакет библиотеки. Вы можете найти их в этом GitHub репозитории
Есть как минимум два случая, при которых такая интеграция будет полезной:
Мы не рекомендуем вам использовать Vue в качестве MVC фреймворка для разработки приложений на основе Webix, поскольку у такого подхода есть свои подводные камни. Размеры Webix виджетов не подстраиваются под лейаут фреймворка, а исправление таких ошибок приведёт к бóльшим издержкам, при сравнительно небольших преимуществах.
Если вы хотите построить интерфейс приложения на основе компонентов библиотеки, вам лучше использовать микрофреймворк Webix Jet . Он разработан специально под Webix и позволяет решать многие задачи более эффективно.
Для интеграции Vue-Webix вы можете использовать следующие инструменты:
Если этих инструментов вам недостаточно, вы можете создать кастомный компонент на основе Vue-Webix.
Обратите внимание, что обсуждаемая интеграция не включена в библиотеку Webix. Чтобы начать использовать ее в своем проекте, вам необходимо взять необходимые исходники с GitHub. Кроме того, они доступны из CDN.
Чтобы использовать фреймворк, вам необходимо сначала подключить его ресурсы в секции <head>...</head>
вашего документа:
<script type="text/javascript"
src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
Затем, вам следует подключить соответствующие JS и CSS файлы библиотеки (в этом случае используются CDN ссылки):
<script type="text/javascript" src="//cdn.webix.com/edge/webix.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.webix.com/edge/webix.css">
Чтобы использовать специфические особенности интеграции, вам необходимо подключить следующие файлы:
<!-- чтобы использовать Webix во Vue приложении -->
<script type="text/javascript" src="//cdn.webix.com/libs/vue/3/webix-ui.js"></script>
<!-- чтобы использовать Vue компонент в Webix приложении -->
<script type="text/javascript" src="//cdn.webix.com/libs/vue/3/vue-view.js"></script>
<!-- для использование готовых-made Vue+Webix контролов -->
<script type="text/javascript"
src="//cdn.webix.com/libs/vue/3/webix-controls.js"></script>
Если вы разрабатываете сложное приложение на основе фреймворка, то вам понадобятся инструменты для работы с большими данными. И такие инструменты предоставляет библиотека Webix.
Чтобы использовать Webix компоненты в приложении на основе фреймворка, вам нужно сделать следующее:
1. Создайте Vue app.
2. Создайте виджет внутри шаблона фреймворка, используя тег <webix-ui>
.
3. Укажите необходимые настройки виджета внутри объекта data
(см. код ниже).
4. Используйте директиву v-bind
, чтобы связать атрибут config
тега <webix-ui>
с объектом data
, который содержит настройки компонента.
Давайте рассмотрим пример, где у нас есть лейаут с двумя столбцами. В первом столбце находится виджет Calendar, а во втором — List. Настройки лейаута описаны в объекте ui
. Теперь нужно задать этот объект атрибуту config
тега <webix-ui>
.
const app = Vue.createApp({
template: `
<div style="width:400px; height: 350px;">
<h3>1. Building UI</h3>
<webix-ui :config='ui'/>
</div>
`,
data() {
return {
ui: {
cols: [
{
view: "calendar",
},
{
view: "list",
select: true,
data,
},
],
},
};
}
});
app.component(...); // init webix-ui component
app.mount("#demo1");
В браузере результат будет таким:
Related sample: Building UI
Вы можете связывать данные нескольких виджетов внутри шаблона фреймворка. Для этого предусмотрена директива v-bind
.
В примере ниже мы связываем Datatable и Button. При клике по кнопке, данные таблицы будут очищены:
const app = Vue.createApp({
template: `
<div style="width:400px; height: 250px;">
<h3>2. One way data binding,
<button v-on:click="data=[]">Clear</button>
</h3>
<webix-ui :config='ui' v-bind:modelValue='data'/>
</div>
`,
data() {
return {
data,
ui: {
view: "datatable",
autoheight: true,
select: "row",
columns:[
{
id: "value",
header: "Section Index"
},
...
]
}
};
}
});
app.component(...); // init webix-ui component
app.mount("#demo2");
Для <webix-ui>
мы задаем конфигурацию datatable (ui:{}
) и загружаем соответствующие данные (data:data
).
Кнопка Clear внутри лейаута прослушивает событие click
используя директиву v-on
. При клике по кнопке, таблица будет очищена.
А в браузере результат будет таким:
а после клика по кнопке таким:
Related sample: One-way Data Binding
Парсинг данных будет напрямую зависеть от компонента, который вы используете. Главный компонент блока webix-ui вызовет метод parse()
/setValues()
/setValue()
(если у него есть такие методы). В дополнение к этому, при загрузке данных, у всех Webix виджетов сработает событие onValue
. Вы можете установить кастомный обработчик на это событие (смотрите пример ниже).
У вас есть возможность настроить двустороннее связывание данных. Это значит, что если вы меняете данные в компоненте фреймворка, эти изменения отразятся на связанном с ним Webix компоненте, и наоборот. Для такого связывания следует использовать директиву v-model
.
Для примера, мы можем создать Vue шаблон с инпутом и добавить к нему webix-лейаут со слайдером, используя конструктор <webix-ui>
. После связывания, любое изменение значения одного виджета незамедлительно отразится на другом. Давайте посмотрим как это реализуется в коде:
const app = Vue.createApp({
template: `
<div style="width:400px; height: 250px;">
<h3>3. Two-way data binding, try to change <input v-model.number='result'></h3>
<webix-ui :config='ui' v-model.number='result'/>
</div>
`,
data() {
return {
result: 50,
ui: {
margin: 20,
rows: [
{
view: "template",
type: "header",
template: "Webix UI",
},
{
view: "slider",
label: "Change me",
labelWidth: 120,
inputWidth: 300,
value: 50,
on: {
onChange() {
this.$scope.$emit("update:modelValue", this.getValue());
},
onValue(value) {
this.setValue(value);
},
},
},
],
},
};
}
});
app.component(...); // init webix-ui component
app.mount("#demo3");
А в браузере результат будет таким:
В примере выше, мы привязали инпут и слайдер к данным, которые хранятся в объекте data
под ключом result
.
При изменении связанных данных (result
), компонент вызывает событие onValue
и меняет свое значение. Если изменить положение слайдера, то компонент вызывает событие onChange, и меняет связанные данные.
Переменная this.$scope
внутри обработчика события onChange
ссылается на Webix компонент (объявленный через конструктор <webix-ui>
).
Related sample: Two-way Data Binding
Вы можете использовать реактивные Vue шаблоны в приложении на основе Webix. Для этого, у библиотеки предусмотрен специальный компонент view:"vue"
. Он представляет собой Vue шаблон, который можно использовать как обычный Webix виджет.
Чтобы использовать этот виджет, вам необходимо подключить соответствующие файлы.
Давайте рассмотрим пример, в котором у нас есть лейаут c компонентами List и Vue. При выборе любой записи списка (list), нам нужно отобразить ее данные в соответствующем шаблоне (vue).
В примере ниже показано как связать компоненты List и Vue:
const list = {
view: "list",
id: "list",
select: true,
template: "#value# (#size#)",
data: [
{ id: 1, value: "Record 1", size: 92 },
...
]
};
const preview = {
view: "vue",
id: "preview",
template: `
<div>
<p>This part is rendered by VueJS, data from the list</p>
<div v-if='value'>
<p>Selected: </p>
<p>Size: <input v-model='size'></p>
</div>
</div>
`,
data: {
value: "",
size: ""
},
watch: {
size(value) {
$$("list").updateItem($$("list").getSelectedId(), { size: value });
}
}
};
$$("preview").bind("list");
Принцип работы следующий:
data
получает значение выбранного элемента спискаwatch
отслеживает изменение параметра size
внутри виджета Vue и обновляет данные в списке.А в браузере результат будет таким:
Related sample: view:"vue" in a Webix App
Вы можете создать гибридный Vue-Webix компонент, поместив соответствующий Webix виджет внутрь шаблона фреймворка. Такой подход будет весьма эффективен, если вам нужно использовать тот или иной компонент несколько раз. А это, в свою очередь, позволяет держать все используемые данные в одном месте.
Давайте рассмотрим пример с инпутом и слайдером, и сделаем так, чтобы они работали синхронно.
Перед началом, не забудьте подключить необходимые ресурсы.
Затем, вам нужно проделать следующее:
1) создайте новый Vue компонент, используя Vue.component(tagName, options)
Подробное описание работы с компонентами фреймворка вы найдете в его документации.
Гибридный компонент мы назовем "my-slider", а его код будет выглядеть так:
const app = Vue.createApp({ ... });
app.component("my-slider", {
// component config options
});
2) укажите необходимые настройки компонента
С полным списком API фреймворка вы можете ознакомиться здесь.
Для слайдера мы будем использовать следующие свойства:
Полный код компонента будет таким:
app.component("my-slider", {
props: ["modelValue"],
// always an empty div
template: "<div></div>",
watch: {
// updates component when the bound value changes
value: {
handler(value) {
webix.$$(this.webixId).setValue(value);
},
},
},
mounted() {
// initializes Webix Slider
this.webixId = webix.ui({
// container and scope are mandatory, other properties are optional
container: this.$el,
$scope: this,
view: "slider",
value: this.modelValue,
});
// informs Vue about the changed value in case of 2-way data binding
$$(this.webixId).attachEvent("onChange", function() {
var value = this.getValue();
// you can use a custom event here
this.$scope.$emit("update:modelValue", value);
});
},
// memory cleaning
destroyed() {
webix.$$(this.webixId).destructor();
},
});
Метод mounted()
будет создавать новый экземпляр слайдера. Метод destroyed()
будет удалять слайдер, если в этом будет необходимость.
3) используйте созданный выше компонент в шаблоне фреймворка (как кастомный элемент)
Для этого вам нужно создать Vue экземпляр:
const app = Vue.createApp({
template: `
<div style='width:300px;'>
<h3>Vue + Webix: Custom UI</h3>
<my-slider v-model.number='progress' />
<div><input type="text" v-model.number='progress' /></div>
</div>
`,
data: {
progress: 50,
},
});
app.component("my-slider", { ... });
app.mount("#demo1");
В коде выше, мы включаем Webix Slider в шаблон фреймворка, а также связываем атрибут progress
(в котором хранятся данные) с инпутом и слайдером. Теперь, при изменении значения одного из контролов, значение второго будет обновляться автоматически.
Related sample: Vue+Webix Custom UI
Если вы не хотите создавать гибридные компоненты описанным выше способом, вы можете использовать уже готовые Vue-Webix виджеты. Библиотека предоставляет следующий набор гибридных контролов для работы с Webix Form:
Чтобы использовать эти контролы, вам необходимо подключить файл webix-controls.js.
В примере ниже показано как применять гибридные контролы в приложении на основе фреймворка:
const app = Vue.createApp({
template: `
<div style='width:500px'>
<fieldset>
<legend>User</legend>
<webix-text label='First Name' v-model.string='fname' />
<webix-text label='Last Name' v-model.string='lname' />
<webix-datepicker label='Birthdate' v-model.date='birthdate' />
<webix-colorpicker label='Color' v-model.string='color' />
<webix-slider label='Level' v-model.number='level' />
</fieldset>
</div>
`,
data: {
fname: "Reno",
lname: "Abrams",
birthdate: new Date(1992, 10, 24),
color: "#aaaff0",
level: 20,
},
});
app.component(...) // register controls
app.mount("#demo1");
А в браузере результат будет таким:
Related sample: Vue+Webix Form Controls
Наверх