不管是vue仍是react,在父子組件通信的時候,子組件都禁止直接修改父級傳過來的prop,父組件總須要在子組件身上監聽一個事件,而後由子組件去觸發它,好讓父組件來接收到payload去改變state。能不能直接在子組件裏修改prop,而後父組件中的state也隨之改變呢? 其實本質上是不行的,但幸運的是,vue爲咱們準備了兩個語法糖作到了這一點,讓咱們減小了一點寫大量模板代碼的痛苦。它們就是自定義組件上的v-model
指令以及.sync
修飾符。vue
假如咱們有以下的一個父組件,想爲子組件傳遞一個名爲val的prop,而且期待有雙向綁定的效果:react
<template> <child-component :val="val" /> </template> <script> export default { data() { return { val: 100 } } } </script> 而子組件負責接收val,而且每click一次button,則讓val+2: <template> <div> <div>{{val}}</div> <button @click="handleClick">click</button> </div> </template>
經過v-model
一個組件上的 v-model 默認會利用名爲 value
的 prop 和名爲 input
的事件,可是像單選框、複選框等類型的輸入控件可能會將 value attribute
用於不一樣的目的。利用model
選項能夠用來避免這樣的衝突。換句話說,你能夠將v-model
的prop以任意名稱來接收,不必定要使用value
, 事件名稱也能夠是任意的,不必定非要寫成input
。以下例:ide
父組件經過v-model傳遞val值:this
<template> <child-component v-model="val" /> </template> 而子組件內經過model選項去綁定這個prop: export default { model: { prop: 'anyKey', // 不必定非要是value event: 'anyEventName' // 不必定非要是input }, props: { anyKey: { type: Number } }, methods: { handleClick() { this.$emit('anyEventName', this.anyKey+2) } } }
父組件裏的 val
的值將會傳入這個名爲 anyKey
的 prop。同時當子組件<child-component>
觸發一個 anyEventName
事件並附帶一個新的值的時候,父組件val
的 state 將會被更新。spa
經過.sync修飾符
父組件經過.sync修飾符傳遞val值:雙向綁定
<template> <child-component :val.sync="val" /> </template>
子組件內接收更簡單,由於vue內部幫咱們綁定了update:myPropName
這樣一個事件:code
export default { props: { val: { type: Number } }, methods: { handleClick() { this.$emit('update:val', this.val+2) } } }
.sync
修飾符寫起來更簡便一些,雙向綁定爽歪歪。不過有一點要注意,像v-bind.sync=」{ title: doc.title }」
這種綁定字面量對象,修飾符是沒法正常工做的。component