Wzór Vue jest w propsdół i w eventsgó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
propsprzekazany do twojego komponentu pozostaje reaktywny (tj. Nie jest sklonowany ani nie wymaga watchfunkcji 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 Taskna 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 propjest skojarzony v-modeli 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ść listLocalcomputed zapewnia prosty interfejs pobierający i ustawiający w komponencie (myśl o tym jak o zmiennej prywatnej). Wewnątrz #task-templatemożesz renderować listLocali pozostanie reaktywny (tj. Jeśli parentListzmieni się, zaktualizuje Taskkomponent). 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ć listLocaldo 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 EditTaskkomponent do wykonywania pewnych modyfikacji danych zadania. Korzystając z tego samego v-modeli obliczonego wzorca właściwości możemy przekazać listLocalkomponentowi (używając v-model):
<script type="text/x-template" id="task-template">
<div>
<EditTask v-model="listLocal"></EditTask>
</div>
</script>
Jeśli EditTaskemituje zmiana będzie to odpowiednio zadzwonić set()na listLocaliw ten sposób propagować wydarzenie na najwyższym poziomie. Podobnie EditTaskkomponent może również wywoływać inne komponenty podrzędne (takie jak elementy formularzy) za pomocą v-model.