Anlamanız gerekir, sahip olduğunuz bileşen hiyerarşisi ve destekleri nasıl geçtiğiniz, kesinlikle durumunuz özeldir ve genellikle geliştiriciler tarafından karşılaşılmaz.
Üst Bileşen -myProp-> Alt Bileşen -myProp-> Torun Bileşeni
MyProp üst bileşende değiştirilirse alt bileşene de yansıtılır .
Ve myProp alt bileşende değiştirilirse torun bileşenine de yansıtılacaktır .
Dolayısıyla myProp üst bileşende değiştirilirse torun bileşenine yansıtılacaktır . (çok uzak çok iyi).
Bu nedenle, hiyerarşiden aşağıya bir şey yapmak zorunda değilsiniz sahne doğası gereği reaktif olacaktır.
Şimdi hiyerarşide yukarı çıkmaktan bahsediyoruz
MyProp grandChild bileşeninde değiştirilirse , alt bileşene yansıtılmaz . Alt öğesinde .sync değiştiricisini kullanmanız ve grandChild bileşeninden olayı yaymanız gerekir.
MyProp alt bileşende değiştirilirse , üst bileşene yansıtılmaz . Üst öğede .sync değiştiricisini kullanmanız ve alt bileşenden emit olayı oluşturmanız gerekir.
MyProp grandChild bileşeninde değiştirilirse , üst bileşene (açıkça) yansıtılmaz . .Sync değiştirici child kullanmalı ve torun bileşeninden olayı emit etmeli, sonra alt bileşendeki prop'i izlemeli ve .sync değiştirici kullanılarak üst bileşen tarafından dinlenen bir değişiklik yayınlamalısınız.
Karışıklığı önlemek için bazı kodlar görelim
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>
Ama bundan sonra vue söyleme çığlık uyarıları fark yardımcı olmaz
'Üst bileşen her yeniden oluşturulduğunda değerin üzerine yazılacağından, bir pervaneyi doğrudan değiştirmekten kaçının.'
Daha önce de belirttiğim gibi, geliştiricilerin çoğu bu sorunla karşılaşmıyor, çünkü bu bir anti-desen. Bu yüzden bu uyarıyı alıyorsunuz.
Ama sorununuzu çözmek için (tasarımınıza göre). Yukarıdaki işi etrafta yapmanız gerektiğine inanıyorum (dürüst olmak için kesmek). Hala tasarımınızı yeniden düşünmenizi ve hatalara daha az eğilimli olmasını tavsiye ederim.
Umut ediyorum bu yardım eder.