Das Vue-Muster ist props
auf und events
ab. 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
props
an Ihre Komponente übergebenen Daten bleiben reaktiv (dh sie werden weder geklont noch erfordern sie eine watch
Funktion 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 Task
Komponente 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 prop
ist v-model
und 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 listLocal
berechnete 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-template
Sie rendern listLocal
und es bleibt reaktiv (dh wenn parentList
Änderungen, wird es die Task
Komponente aktualisieren ). Sie können auch mutieren, listLocal
indem 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 listLocal
an 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 EditTask
Komponente, um Änderungen an den Aufgabendaten vorzunehmen. Unter Verwendung des gleichen v-model
und berechneten Eigenschaftenmusters können wir listLocal
an die Komponente übergeben (unter Verwendung v-model
):
<script type="text/x-template" id="task-template">
<div>
<EditTask v-model="listLocal"></EditTask>
</div>
</script>
Wenn EditTask
aussendet eine Änderung es in geeigneter Weise ruft set()
auf listLocal
und damit propagieren das Ereignis auf die oberste Ebene. In ähnlicher Weise kann die EditTask
Komponente auch andere untergeordnete Komponenten (z. B. Formularelemente) mit aufrufen v-model
.