Das Vue-Muster ist propsauf und eventsab. Es klingt einfach, ist aber beim Schreiben einer benutzerdefinierten Komponente leicht zu vergessen.
Ab Vue 2.2.0 können Sie das V-Modell (mit berechneten Eigenschaften ) verwenden. Ich habe festgestellt, dass diese Kombination eine einfache, saubere und konsistente Schnittstelle zwischen Komponenten schafft:
- Alle
propsan Ihre Komponente übergebenen Daten bleiben reaktiv (dh sie werden weder geklont noch erfordern sie eine watchFunktion zum Aktualisieren einer lokalen Kopie, wenn Änderungen erkannt werden).
- Änderungen werden automatisch an das übergeordnete Element gesendet.
- Kann mit mehreren Ebenen von Komponenten verwendet werden.
Eine berechnete Eigenschaft ermöglicht die getrennte Definition von Setter und Getter. Dadurch kann die TaskKomponente wie folgt umgeschrieben werden:
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)
}
}
}
})
Die Modelleigenschaft definiert, welcher Funktion zugeordnet propist v-modelund welches Ereignis bei Änderungen ausgegeben wird. Sie können diese Komponente dann vom übergeordneten Element aus wie folgt aufrufen:
<Task v-model="parentList"></Task>
Die listLocalberechnete Eigenschaft bietet eine einfache Getter- und Setter-Schnittstelle innerhalb der Komponente (stellen Sie sich vor, es handelt sich um eine private Variable). Innerhalb können #task-templateSie rendern listLocalund es bleibt reaktiv (dh wenn parentListÄnderungen, wird es die TaskKomponente aktualisieren ). Sie können auch mutieren, listLocalindem Sie den Setter aufrufen (z. B. this.listLocal = newList), und die Änderung wird an das übergeordnete Element gesendet.
Das Besondere an diesem Muster ist, dass Sie es listLocalan eine untergeordnete Komponente von Task(using v-model) übergeben können und Änderungen von der untergeordneten Komponente an die Komponente der obersten Ebene weitergegeben werden.
Angenommen, wir haben eine separate EditTaskKomponente, um Änderungen an den Aufgabendaten vorzunehmen. Unter Verwendung des gleichen v-modelund berechneten Eigenschaftenmusters können wir listLocalan die Komponente übergeben (unter Verwendung v-model):
<script type="text/x-template" id="task-template">
<div>
<EditTask v-model="listLocal"></EditTask>
</div>
</script>
Wenn EditTaskaussendet eine Änderung es in geeigneter Weise ruft set()auf listLocalund damit propagieren das Ereignis auf die oberste Ebene. In ähnlicher Weise kann die EditTaskKomponente auch andere untergeordnete Komponenten (z. B. Formularelemente) mit aufrufen v-model.