Sie müssen verstehen, welche Komponentenhierarchie Sie haben und wie Sie Requisiten übergeben. Auf jeden Fall ist Ihr Fall etwas Besonderes und wird von den Entwicklern normalerweise nicht angetroffen.
Übergeordnete Komponente -myProp-> Untergeordnete Komponente -myProp-> Enkelkind-Komponente
Wenn myProp in der übergeordneten Komponente geändert wird, wird dies auch in der untergeordneten Komponente angezeigt .
Und wenn myProp in der untergeordneten Komponente geändert wird, wird dies auch in der Enkelkomponente wiedergegeben .
Wenn also myProp in der übergeordneten Komponente geändert wird, wird es in der Enkelkomponente wiedergegeben . (So weit, ist es gut).
Daher müssen Sie in der gesamten Hierarchie nichts tun. Requisiten sind von Natur aus reaktiv.
Ich spreche jetzt davon, in der Hierarchie aufzusteigen
Wenn myProp in der grandChild-Komponente geändert wird , wird es nicht wiedergegeben . Sie müssen den Modifikator .sync in child verwenden und ein Ereignis von der grandChild-Komponente ausgeben.
Wenn myProp in der untergeordneten Komponente geändert wird , wird es nicht in der übergeordneten Komponente wiedergegeben. Sie müssen den Modifikator .sync im übergeordneten Element verwenden und ein Ereignis von der untergeordneten Komponente ausgeben.
Wenn myProp in der grandChild-Komponente geändert wird , wird es (offensichtlich) nicht in der übergeordneten Komponente wiedergegeben. Sie müssen den untergeordneten Modifikator .sync verwenden und ein Ereignis von der Enkelkomponente ausgeben, dann die Requisite in der untergeordneten Komponente beobachten und ein Ereignis bei Änderung ausgeben, das von der übergeordneten Komponente mit dem Modifikator .sync abgehört wird.
Sehen wir uns einen Code an, um Verwirrung zu vermeiden
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>
Enkelkind
<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>
Aber danach werden Sie die schreienden Warnungen des Vue-Sprichworts nicht mehr bemerken
'Vermeiden Sie es, eine Requisite direkt zu mutieren, da der Wert bei jedem erneuten Rendern der übergeordneten Komponente überschrieben wird.'
Wie ich bereits erwähnt habe, stoßen die meisten Entwickler nicht auf dieses Problem, da es sich um ein Anti-Pattern handelt. Deshalb erhalten Sie diese Warnung.
Aber um Ihr Problem zu lösen (entsprechend Ihrem Design). Ich glaube, Sie müssen die oben genannten Probleme umgehen (Hack, um ehrlich zu sein). Ich empfehle Ihnen dennoch, Ihr Design zu überdenken und zu machen, ist weniger anfällig für Fehler.
Ich hoffe, es hilft.