Візерунок 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
.