คุณต้องเข้าใจลำดับชั้นขององค์ประกอบที่คุณมีและวิธีการส่งอุปกรณ์ประกอบฉากกรณีของคุณเป็นสิ่งพิเศษและไม่ได้พบกับ devs
พาเรนต์คอมโพเนนต์ -myProp-> คอมโพเนนต์ลูก -myProp-> คอมโพเนนต์ Grandchild
ถ้า myProp เปลี่ยนไปในองค์ประกอบพาเรนต์ระบบจะแสดงผลในองค์ประกอบย่อยด้วย
และหาก myProp เปลี่ยนไปในองค์ประกอบลูก ๆ มันก็จะแสดงให้เห็นในองค์ประกอบของหลานด้วย
ดังนั้นหาก myProp เปลี่ยนไปในองค์ประกอบหลักแล้วมันจะปรากฏในองค์ประกอบของหลาน (ดีมาก)
ดังนั้นลำดับชั้นที่คุณไม่ต้องทำอุปกรณ์ประกอบฉากใด ๆ จะมีปฏิกิริยาโดยเนื้อแท้
ตอนนี้กำลังพูดถึงการเพิ่มขึ้นของลำดับชั้น
หาก myProp เปลี่ยนไปในองค์ประกอบ grandChild จะไม่มีผลกับองค์ประกอบลูก คุณต้องใช้. sync โมดิฟายเออร์ในเหตุการณ์ child และ emit จากองค์ประกอบ grandChild
หาก myProp เปลี่ยนไปในองค์ประกอบลูกมันจะไม่ปรากฏในองค์ประกอบหลัก คุณต้องใช้. sync โมดิฟายเออร์ใน parent และปล่อยอีเวนต์จากองค์ประกอบลูก
หาก myProp เปลี่ยนไปในองค์ประกอบ grandChild จะไม่มีผลกับองค์ประกอบหลัก (ชัด ๆ ) คุณต้องใช้. sync โมดิฟายเออร์และปล่อยอีเวนต์จากองค์ประกอบของ grandchild จากนั้นเฝ้าดู prop ในคอมโพเนนต์ย่อยและปล่อยอีเวนต์เมื่อมีการเปลี่ยนแปลงซึ่งจะถูกฟังโดยองค์ประกอบหลักโดยใช้โมดิฟายเออร์
ลองดูโค้ดเพื่อหลีกเลี่ยงความสับสน
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
'หลีกเลี่ยงการกลายพันธุ์ prop โดยตรงเนื่องจากค่าจะถูกเขียนทับเมื่อใดก็ตามที่องค์ประกอบหลักแสดงผลอีกครั้ง'
อีกครั้งที่ฉันกล่าวถึง devs ส่วนใหญ่ไม่พบปัญหานี้เพราะเป็นรูปแบบการต่อต้าน นั่นเป็นเหตุผลที่คุณได้รับคำเตือนนี้
แต่เพื่อที่จะแก้ปัญหาของคุณ (ตามการออกแบบของคุณ) ฉันเชื่อว่าคุณต้องทำงานข้างต้น (แฮ็คจะซื่อสัตย์) ฉันยังคงแนะนำให้คุณทบทวนการออกแบบของคุณใหม่
ฉันหวังว่ามันจะช่วย