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