Візерунок Vue propsвниз і eventsвгору. Це звучить просто, але його легко забути при написанні користувацького компонента.
Станом на Vue 2.2.0 ви можете використовувати v-модель (з обчисленими властивостями ). Я виявив, що це поєднання створює простий, чистий та послідовний інтерфейс між компонентами:
- Будь-який
propsпереданий вашому компоненту залишається реактивним (тобто він не клонований, а також не потрібна watchфункція оновлення локальної копії при виявленні змін).
- Зміни автоматично надсилаються до батьків.
- Можна використовувати з різними рівнями компонентів.
Обчислена властивість дозволяє сетеру та геттеру окремо визначатись. Це дозволяє Taskпереписати компонент наступним чином:
Vue.component('Task', {
template: '#task-template',
props: ['list'],
model: {
prop: 'list',
event: 'listchange'
},
computed: {
listLocal: {
get: function() {
return this.list
},
set: function(value) {
this.$emit('listchange', value)
}
}
}
})
У модель визначає нерухомість , яка propасоціюється з v-model, і яка подія буде виділятися на змінах. Потім ви можете зателефонувати цьому компоненту від батьків наступним чином:
<Task v-model="parentList"></Task>
listLocalОбчислення властивість забезпечує простий і геттер сетер інтерфейс всередині компонента (думаю про нього , як бути закритою змінної). Всередині #task-templateви можете візуалізувати, listLocalі він залишатиметься реактивним (тобто, якщо parentListзміни будуть оновлені, Taskкомпонент). Ви також можете мутувати listLocal, зателефонувавши до сетера (наприклад, this.listLocal = newList), і він передасть зміну батькові.
Що в цьому шаблоні чудово, це те, що ви можете перейти listLocalдо дочірнього компонента Task(використовуючи v-model), а зміни від дочірнього компонента поширяться на компонент верхнього рівня.
Наприклад, скажімо, у нас є окремий EditTaskкомпонент для внесення змін до даних завдання. Використовуючи той самий v-modelі обчислений шаблон властивостей, ми можемо перейти listLocalдо компонента (використовуючи v-model):
<script type="text/x-template" id="task-template">
<div>
<EditTask v-model="listLocal"></EditTask>
</div>
</script>
Якщо EditTaskвипускає зміна буде відповідним чином зателефонувати set()на listLocalі тим самим поширити подія до рівня верхнього. Аналогічно, EditTaskкомпонент також може викликати інші дочірні компоненти (наприклад, елементи форми), використовуючи v-model.