Vous devez comprendre, la hiérarchie des composants que vous avez et comment vous passez des accessoires, votre cas est certainement spécial et n'est généralement pas rencontré par les développeurs.
Composant parent -myProp-> Composant enfant -myProp-> Composant petit-enfant
Si myProp est modifié dans le composant parent, il sera également reflété dans le composant enfant.
Et si myProp est modifié dans le composant enfant, il sera également reflété dans le composant petit-enfant.
Donc, si myProp est modifié dans le composant parent, il sera reflété dans le composant petit-enfant. (jusqu'ici tout va bien).
Par conséquent, dans la hiérarchie, vous n'avez rien à faire, les accessoires seront intrinsèquement réactifs.
Parlons maintenant de monter dans la hiérarchie
Si myProp est modifié dans le composant grandChild, il ne sera pas reflété dans le composant enfant. Vous devez utiliser le modificateur .sync dans l'enfant et émettre un événement à partir du composant grandChild.
Si myProp est modifié dans le composant enfant, il ne sera pas reflété dans le composant parent. Vous devez utiliser le modificateur .sync dans le parent et émettre un événement à partir du composant enfant.
Si myProp est modifié dans le composant grandChild, il ne sera pas reflété dans le composant parent (évidemment). Vous devez utiliser le modificateur .sync enfant et émettre un événement à partir du composant petit-enfant, puis regarder l'accessoire dans le composant enfant et émettre un événement lors de la modification qui est écouté par le composant parent à l'aide du modificateur .sync.
Voyons un peu de code pour éviter toute confusion
Parent.vue
<template>
<div>
<child :myProp.sync="myProp"></child>
<input v-model="myProp"/>
<p>{{myProp}}</p>
</div>
</template>
<script>
import child from './Child.vue'
export default{
data(){
return{
myProp:"hello"
}
},
components:{
child
}
}
</script>
<style scoped>
</style>
Child.vue
<template>
<div> <grand-child :myProp.sync="myProp"></grand-child>
<p>{{myProp}}</p>
</div>
</template>
<script>
import grandChild from './Grandchild.vue'
export default{
components:{
grandChild
},
props:['myProp'],
watch:{
'myProp'(){
this.$emit('update:myProp',this.myProp)
}
}
}
</script>
<style>
</style>
Petitchild.vue
<template>
<div><p>{{myProp}}</p>
<input v-model="myProp" @input="changed"/>
</div>
</template>
<script>
export default{
props:['myProp'],
methods:{
changed(event){
this.$emit('update:myProp',this.myProp)
}
}
}
</script>
<style>
</style>
Mais après cela, vous n'aurez pas remarqué les avertissements hurlants de vue disant
'Évitez de muter directement un accessoire car la valeur sera écrasée chaque fois que le composant parent sera rendu.'
Encore une fois, comme je l'ai mentionné plus tôt, la plupart des développeurs ne rencontrent pas ce problème, car c'est un anti pattern. C'est pourquoi vous obtenez cet avertissement.
Mais afin de résoudre votre problème (selon votre conception). Je crois que vous devez faire le travail ci-dessus (pirater pour être honnête). Je vous recommande tout de même de repenser votre conception et de la rendre moins sujette aux bugs.
J'espère que ça aide.