あなたが持っているコンポーネント階層と小道具を渡す方法を理解する必要があります、間違いなくあなたのケースは特別であり、通常開発者が遭遇することはありません。
親コンポーネント-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>
しかし、この後、Vueの叫び声の警告に気付かずにはいられません。
「親コンポーネントが再レンダリングされるたびに値が上書きされるため、プロップを直接変更しないでください。」
先に述べたように、これはアンチパターンであるため、ほとんどの開発者はこの問題に遭遇しません。そのため、この警告が表示されます。
しかし、あなたの問題を解決するために(あなたの設計に従って)。私はあなたが上記の作業を回避する必要があると信じています(正直に言うとハック)。私はまだあなたにあなたのデザインを再考するべきであり、makeがバグを起こしにくいことを勧めます。
お役に立てば幸いです。