您需要了解您所拥有的组件层次结构以及如何传递道具,当然您的情况很特殊,开发人员通常不会遇到这种情况。
父组件-myProp->子组件-myProp->孙子组件
如果myProp在父组件中进行了更改,它也将反映在子组件中。
如果myProp在子组件中更改,它也将反映在子组件中。
因此,如果myProp在父组件中更改,那么它将反映在孙组件中。(到目前为止,一切都很好)。
因此,在层次结构中,您无需执行任何操作,道具本质上就是被动的。
现在谈论上级
如果在grandChild组件中更改了myProp,它将不会反映在子组件中。您必须在child中使用.sync修饰符,并从grandChild组件发出事件。
如果myProp在子组件中更改,则不会反映在父组件中。您必须在父级中使用.sync修饰符并从子级组件发出事件。
如果在grandChild组件中更改了myProp,则它不会反映在父组件中(很明显)。您必须使用.sync修饰符child并从孙子组件中发出事件,然后在子组件中观察prop并在父组件使用.sync修饰符侦听更改时发出事件。
让我们看一些代码以避免混淆
亲子
<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>
小孩
<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>
孙子
<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的尖叫警告
“避免直接更改道具,因为每当父组件重新渲染时,该值就会被覆盖。”
同样,正如我之前提到的,大多数开发人员都不会遇到此问题,因为这是一种反模式。这就是为什么您收到此警告。
但是为了解决您的问题(根据您的设计)。我相信您必须解决以上问题(老实说,hack)。我仍然建议您应该重新考虑您的设计,使它不易出现错误。
希望对您有所帮助。