Вам потрібно зрозуміти, ієрархія складових, яку ви маєте, і як ви передаєте реквізит, безумовно, ваш випадок особливий і зазвичай не стикається з розробниками.
Батьківський компонент -myProp-> Дочірній компонент -myProp-> Компонент онука
Якщо myProp буде змінено на батьківський компонент, це відобразиться і в дочірнім компоненті.
І якщо myProp буде змінено на дочірній компонент, це відобразиться і на компоненті онука.
Отже, якщо myProp буде змінено у батьківському компоненті, це відобразиться на компоненті внука. (все йде нормально).
Тому вниз по ієрархії, вам не потрібно нічого робити, реквізит буде за своєю суттю реактивним.
Зараз ми говоримо про підйом в ієрархії
Якщо myProp змінено в компоненті grandChild, він не відображатиметься в дочірньому компоненті. Ви повинні використовувати .sync-модифікатор у дочірніх та випромінювати події з компонента grandChild.
Якщо myProp змінено в дочірньому компоненті, він не відображатиметься в батьківському компоненті. Ви повинні використовувати .sync-модифікатор у батьківському і випромінювати події з дочірнього компонента.
Якщо myProp буде змінено в компоненті grandChild, він не відображатиметься в батьківському компоненті (очевидно). Вам потрібно використовувати дочірний модифікатор .sync та випромінювати подію з компонента онука, а потім спостерігати за опорою на дочірній компонент та випромінювати подію на зміну, яку слухає батьківський компонент за допомогою модифікатора .sync.
Давайте подивимось якийсь код, щоб уникнути плутанини
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>
Але після цього ви не допоможете помітити кричущі попередження про висловлювання
"Уникайте мутації опори безпосередньо, оскільки значення буде перезаписано кожного разу, коли батьківський компонент повторно відображає."
Знову, як я вже згадував, більшість розробників не стикаються з цим питанням, тому що це анти-модель. Ось чому ви отримуєте це попередження.
Але для того, щоб вирішити своє питання (відповідно до вашого дизайну). Я вважаю, що ви повинні виконати вищезгадану роботу навколо (хак, щоб бути чесним). Я все ж рекомендую вам переосмислити свій дизайн і зробити менш схильним до помилок.
Я сподіваюся, що це допомагає.