Debe comprender la jerarquía de componentes que tiene y cómo está pasando los accesorios, definitivamente su caso es especial y los desarrolladores no suelen encontrarlo.
Componente principal -myProp-> Componente secundario -myProp-> Componente nieto
Si myProp se cambia en el componente principal, también se reflejará en el componente secundario.
Y si myProp se cambia en el componente hijo, también se reflejará en el componente nieto.
Entonces, si myProp se cambia en el componente principal , se reflejará en el componente nieto. (Hasta aquí todo bien).
Por lo tanto, en la jerarquía, no tiene que hacer nada, los accesorios serán inherentemente reactivos.
Ahora hablando de subir en jerarquía
Si myProp se cambia en el componente grandChild , no se reflejará en el componente secundario. Debe usar el modificador .sync en el elemento secundario y emitir un evento desde el componente grandChild.
Si myProp se cambia en el componente secundario , no se reflejará en el componente principal. Debe usar el modificador .sync en el elemento primario y emitir un evento desde el componente secundario.
Si myProp se cambia en el componente grandChild , no se reflejará en el componente principal (obviamente). Tiene que usar el modificador .sync hijo y emitir un evento desde el componente nieto, luego mirar el accesorio en el componente hijo y emitir un evento sobre el cambio que está escuchando el componente padre utilizando el modificador .sync.
Veamos un código para evitar confusiones.
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>
Grandchild.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>
Pero después de esto, no ayudarás a notar las advertencias de vue diciendo
'Evite mutar un accesorio directamente ya que el valor se sobrescribirá cada vez que el componente principal se vuelva a representar'.
Nuevamente, como mencioné anteriormente, la mayoría de los desarrolladores no encuentran este problema, porque es un anti patrón. Es por eso que recibes esta advertencia.
Pero para resolver su problema (de acuerdo con su diseño). Creo que tienes que hacer el trabajo anterior (piratear para ser honesto). Todavía te recomiendo que vuelvas a pensar en tu diseño y que sea menos propenso a errores.
Espero que ayude.