Шаблон 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>
Свойство listLocalcomputed обеспечивает простой интерфейс метода получения и установки в компоненте (думайте, что это частная переменная). Внутри #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.