|
無論是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 > 《待分類》