您需要了解您所拥有的组件层次结构以及您如何传递props,当然您的情况很特殊,开发人员通常不会遇到。
父组件-myProp-> 子组件-myProp-> 孙组件
如果 myProp 在父组件中更改,它也会反映在子组件中。
如果 myProp 在子组件中更改,它也会反映在孙组件中。
因此,如果 myProp 在父组件中更改,那么它将反映在孙组件中。(到目前为止,一切都很好)。
因此,在层次结构中,您不必做任何事情props将具有内在的react性。
现在谈论在层次结构中上升
如果在grandChild 组件中更改了myProp,它将不会反映在子组件中。您必须在 child 中使用 .sync 修饰符并从 grandChild 组件发出事件。
如果 myProp 在子组件中更改,则不会反映在父组件中。您必须在父组件中使用 .sync 修饰符并从子组件发出事件。
如果在grandChild 组件中更改了myProp,它将不会反映在父组件中(显然)。您必须使用 .sync 修饰符 child 并从孙组件发出事件,然后观察子组件中的 prop 并在父组件使用 .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>
儿童.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,因为每当父组件重新渲染时,该值都会被覆盖。”
同样,正如我之前提到的,大多数开发人员都不会遇到这个问题,因为这是一种反模式。这就是您收到此警告的原因。
但是为了解决您的问题(根据您的设计)。我相信你必须做上述工作(老实说是黑客)。我仍然建议您重新考虑您的设计,并且 make 不太容易出现错误。
我希望它有帮助。