Шаблон 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
computed обеспечивает простой интерфейс метода получения и установки в компоненте (думайте, что это частная переменная). Внутри #task-template
вы можете выполнить рендеринг, listLocal
и он останется реактивным (т. Е. При parentList
изменении он обновит Task
компонент). Вы также можете изменить listLocal
его, вызвав сеттер (например, this.listLocal = newList
), и он отправит изменения родителю.
Что хорошо в этом шаблоне, так это то, что вы можете перейти listLocal
к дочернему компоненту Task
(using 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
.