Bạn cần phải hiểu, hệ thống phân cấp thành phần bạn đang có và cách bạn truyền đạo cụ, chắc chắn trường hợp của bạn là đặc biệt và thường không gặp phải bởi các nhà phát triển.
Thành phần phụ huynh -myProp-> Thành phần con -myProp-> Thành phần cháu
Nếu myProp bị thay đổi trong thành phần cha mẹ, nó cũng sẽ được phản ánh trong thành phần con.
Và nếu myProp bị thay đổi trong thành phần con, nó sẽ được phản ánh trong thành phần cháu.
Vì vậy, nếu myProp bị thay đổi trong thành phần cha thì nó sẽ được phản ánh trong thành phần cháu. (càng xa càng tốt).
Do đó, theo thứ bậc, bạn không cần phải làm bất cứ điều gì đạo cụ sẽ phản ứng lại.
Bây giờ nói về việc đi lên trong hệ thống phân cấp
Nếu myProp bị thay đổi trong thành phần grandChild, nó sẽ không được phản ánh trong thành phần con. Bạn phải sử dụng công cụ sửa đổi .sync trong phần tử con và phát ra sự kiện từ thành phần grandChild.
Nếu myProp bị thay đổi trong thành phần con, nó sẽ không được phản ánh trong thành phần chính. Bạn phải sử dụng công cụ sửa đổi .sync trong cha mẹ và phát ra sự kiện từ thành phần con.
Nếu myProp bị thay đổi trong thành phần grandChild, nó sẽ không được phản ánh trong thành phần chính (rõ ràng). Bạn phải sử dụng con sửa đổi .sync và phát ra sự kiện từ thành phần cháu, sau đó xem prop trong thành phần con và phát ra một sự kiện thay đổi đang được nghe bởi thành phần cha mẹ bằng cách sử dụng sửa đổi .sync.
Hãy xem một số mã để tránh nhầm lẫn
Phụ huynh
<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>
Con.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>
Cháu
<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>
Nhưng sau đó, bạn sẽ không giúp nhận thấy những cảnh báo la hét của vue nói
'Tránh đột biến prop trực tiếp vì giá trị sẽ bị ghi đè bất cứ khi nào thành phần cha mẹ tái xuất hiện.'
Một lần nữa như tôi đã đề cập trước đó, hầu hết các nhà phát triển không gặp phải vấn đề này, bởi vì đó là một mô hình chống. Đó là lý do tại sao bạn nhận được cảnh báo này.
Nhưng để giải quyết vấn đề của bạn (theo thiết kế của bạn). Tôi tin rằng bạn phải thực hiện các công việc trên (hack phải trung thực). Tôi vẫn khuyên bạn nên suy nghĩ lại về thiết kế của bạn và làm cho ít bị lỗi hơn.
Tôi hy vọng nó sẽ giúp.