Le modèle Vue est propsvers le bas et vers le eventshaut. 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
propspassé à votre composant reste réactif (c'est-à-dire qu'il n'est pas cloné et ne nécessite pas de watchfonction 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 Taskcomposant 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 propest associé v-modelet 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 listLocalproprié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-templatevous pouvez effectuer le rendu listLocalet il restera réactif (c'est-à-dire que si des parentListmodifications sont apportées, le Taskcomposant sera mis à jour ). Vous pouvez également muter listLocalen 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 EditTaskcomposant séparé pour effectuer un type de modification sur les données de la tâche. En utilisant le même v-modelmodèle de propriétés calculées, nous pouvons passer listLocalau 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 listLocalet ainsi propager l'événement au niveau supérieur. De même, le EditTaskcomposant peut également appeler d'autres composants enfants (tels que des éléments de formulaire) à l'aide de v-model.