Le modèle Vue est props
vers le bas et vers le events
haut. Cela semble simple, mais il est facile de l'oublier lors de l'écriture d'un composant personnalisé.
Depuis Vue 2.2.0, vous pouvez utiliser v-model (avec des propriétés calculées ). J'ai trouvé que cette combinaison crée une interface simple, propre et cohérente entre les composants:
- Tout ce qui est
props
passé à votre composant reste réactif (c'est-à-dire qu'il n'est pas cloné et ne nécessite pas de watch
fonction pour mettre à jour une copie locale lorsque des changements sont détectés).
- Les modifications sont automatiquement envoyées au parent.
- Peut être utilisé avec plusieurs niveaux de composants.
Une propriété calculée permet au setter et au getter d'être définis séparément. Cela permet au Task
composant d'être réécrit comme suit:
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)
}
}
}
})
La propriété model définit ce qui prop
est associé v-model
et quel événement sera émis lors des modifications. Vous pouvez ensuite appeler ce composant depuis le parent comme suit:
<Task v-model="parentList"></Task>
La listLocal
propriété calculée fournit une interface de lecture et de définition simple dans le composant (pensez-y comme étant une variable privée). À l'intérieur, #task-template
vous pouvez effectuer le rendu listLocal
et il restera réactif (c'est-à-dire que si des parentList
modifications sont apportées, le Task
composant sera mis à jour ). Vous pouvez également muter listLocal
en appelant le setter (par exemple, this.listLocal = newList
) et il émettra le changement au parent.
Ce qui est génial avec ce modèle, c'est que vous pouvez passer listLocal
à un composant enfant de Task
(using v-model
), et les modifications du composant enfant se propageront au composant de niveau supérieur.
Par exemple, disons que nous avons un EditTask
composant séparé pour effectuer un type de modification sur les données de la tâche. En utilisant le même v-model
modèle de propriétés calculées, nous pouvons passer listLocal
au composant (en utilisant v-model
):
<script type="text/x-template" id="task-template">
<div>
<EditTask v-model="listLocal"></EditTask>
</div>
</script>
Si EditTask
émet un changement , il appellera de façon appropriée set()
sur listLocal
et ainsi propager l'événement au niveau supérieur. De même, le EditTask
composant peut également appeler d'autres composants enfants (tels que des éléments de formulaire) à l'aide de v-model
.