Anda perlu memahami, hierarki komponen yang Anda miliki dan bagaimana Anda melewati alat peraga, pasti kasus Anda istimewa dan biasanya tidak ditemui oleh para pengembang.
Komponen Induk -myProp-> Komponen Anak -myProp-> Komponen Cucu
Jika myProp diubah dalam komponen induk, itu akan tercermin dalam komponen turunan juga.
Dan jika myProp diubah dalam komponen anak itu akan tercermin dalam komponen cucu juga.
Jadi jika myProp diubah dalam komponen induk maka akan tercermin dalam komponen cucu. (sejauh ini baik).
Oleh karena itu turun hierarki Anda tidak perlu melakukan alat peraga apa pun akan secara inheren reaktif
Sekarang berbicara tentang naik dalam hierarki
Jika myProp diubah dalam komponen grandChild, itu tidak akan tercermin dalam komponen anak. Anda harus menggunakan pengubah .sync pada child dan memancarkan event dari komponen grandChild.
Jika myProp diubah dalam komponen anak, itu tidak akan tercermin dalam komponen induk. Anda harus menggunakan pengubah .sync di induk dan memancarkan peristiwa dari komponen anak.
Jika myProp diubah dalam komponen grandChild, itu tidak akan tercermin dalam komponen induk (jelas). Anda harus menggunakan anak pengubah .sync dan memancarkan peristiwa dari komponen cucu, kemudian menonton prop dalam komponen anak dan memancarkan peristiwa pada perubahan yang sedang didengarkan oleh komponen induk menggunakan pengubah .sync.
Mari kita lihat beberapa kode untuk menghindari kebingungan
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>
Anak
<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>
Tetapi setelah ini, Anda tidak akan membantu memperhatikan peringatan teriakan dari vue mengatakan
'Hindari bermutasi prop secara langsung karena nilai akan ditimpa setiap kali komponen induk dirender.'
Sekali lagi seperti yang saya sebutkan sebelumnya sebagian besar devs tidak menemui masalah ini, karena ini merupakan pola anti. Itu sebabnya Anda mendapatkan peringatan ini.
Tetapi untuk menyelesaikan masalah Anda (sesuai dengan desain Anda). Saya percaya Anda harus melakukan pekerjaan di atas (hack jujur). Saya masih menyarankan Anda harus memikirkan kembali desain Anda dan membuatnya kurang rentan terhadap bug.
Saya harap ini membantu.