無論是vue還是react,在父子組件通訊的時候,子組件都禁止直接修改父級傳過來的prop,父組件總需要在子組件身上監(jiān)聽一個事件,然后由子組件去觸發(fā)它,好讓父組件來接收到payload去改變state。能不能直接在子組件里修改prop,然后父組件中的state也隨之改變呢? 其實本質(zhì)上是不行的,但幸運的是,vue為我們準(zhǔn)備了兩個語法糖做到了這一點,讓我們減少了一點寫大量模板代碼的痛苦。它們就是自定義組件上的 假如我們有如下的一個父組件,想為子組件傳遞一個名為val的prop,并且期待有雙向綁定的效果: <template> <child-component :val="val" data-tomark-pass /> </template> <script> export default { data() { return { val: 100 } } } </script> 而子組件負(fù)責(zé)接收val,并且每click一次button,則讓val+2: <template> <div> <div>{{val}}</div> <button @click="handleClick">click</button> </div> </template> 通過v-model一個組件上的 v-model 默認(rèn)會利用名為 父組件通過v-model傳遞val值: <template> <child-component v-model="val" data-tomark-pass /> </template> 而子組件內(nèi)通過model選項去綁定這個prop: export default { model: { prop: 'anyKey', // 不一定非要是value event: 'anyEventName' // 不一定非要是input }, props: { anyKey: { type: Number } }, methods: { handleClick() { this.$emit('anyEventName', this.anyKey+2) } } } 父組件里的 通過.sync修飾符父組件通過.sync修飾符傳遞val值: <template> <child-component :val.sync="val" data-tomark-pass /> </template> 子組件內(nèi)接收更簡單,因為vue內(nèi)部幫我們綁定了 export default { props: { val: { type: Number } }, methods: { handleClick() { this.$emit('update:val', this.val+2) } } }
|
|
來自: 昵稱71567378 > 《待分類》