Wzór Vue jest w props
dół i w events
górę. Brzmi prosto, ale łatwo o tym zapomnieć, pisząc komponent niestandardowy.
Od wersji Vue 2.2.0 możesz używać modelu v (z obliczonymi właściwościami ). Odkryłem, że ta kombinacja tworzy prosty, czysty i spójny interfejs między komponentami:
- Każdy
props
przekazany do twojego komponentu pozostaje reaktywny (tj. Nie jest sklonowany ani nie wymaga watch
funkcji aktualizowania kopii lokalnej po wykryciu zmian).
- Zmiany są automatycznie wysyłane do rodzica.
- Może być używany z wieloma poziomami komponentów.
Obliczona właściwość umożliwia oddzielne definiowanie metody ustawiającej i pobierającej. Pozwala to Task
na przepisanie komponentu w następujący sposób:
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)
}
}
}
})
Właściwość modelu określa, z którym elementem prop
jest skojarzony v-model
i które zdarzenie będzie emitowane przy zmianie. Następnie możesz wywołać ten komponent od rodzica w następujący sposób:
<Task v-model="parentList"></Task>
Właściwość listLocal
computed zapewnia prosty interfejs pobierający i ustawiający w komponencie (myśl o tym jak o zmiennej prywatnej). Wewnątrz #task-template
możesz renderować listLocal
i pozostanie reaktywny (tj. Jeśli parentList
zmieni się, zaktualizuje Task
komponent). Możesz także dokonać mutacji listLocal
, wywołując ustawiającego (np. this.listLocal = newList
), A wyśle on zmianę do rodzica.
Wspaniałe w tym wzorcu jest to, że możesz przekazać listLocal
do komponentu potomnego Task
(używając v-model
), a zmiany z komponentu potomnego będą propagowane do komponentu najwyższego poziomu.
Załóżmy na przykład, że mamy oddzielny EditTask
komponent do wykonywania pewnych modyfikacji danych zadania. Korzystając z tego samego v-model
i obliczonego wzorca właściwości możemy przekazać listLocal
komponentowi (używając v-model
):
<script type="text/x-template" id="task-template">
<div>
<EditTask v-model="listLocal"></EditTask>
</div>
</script>
Jeśli EditTask
emituje zmiana będzie to odpowiednio zadzwonić set()
na listLocal
iw ten sposób propagować wydarzenie na najwyższym poziomie. Podobnie EditTask
komponent może również wywoływać inne komponenty podrzędne (takie jak elementy formularzy) za pomocą v-model
.