父組件:
<div id="father">
這里是父組件 父組件的v-model:{{isShow}}
<child :test="aaa" v-model="isShow"></child>
</div>
子組件:
props:{
value:{//可以直接通過value獲取?在父頁面v-model綁定給子組件上的值
?type:Boolean,
?default:true
},
}
官方解釋:
<input v-model="searchText">
等價于
<input :value="searchText" @input="searchText=$event.target.value">
用在組件上時
<custom-input? :value="searchText"? @input="searchText=$event"></custom-input>
所以可以這樣用:
父組件中:
<child? v-model="number"></child>
子組件
props:{value:{}}
<div @click="$emit('input',value+1)">//通過input事件來使父組件的number+1
解釋說明:
通過v-bind把父組件的數(shù)據(jù)綁定到了子組件的props屬性中,而在props上默認用value取值,然后通過$emit觸發(fā)事件input,因為v-model綁定的事件是input,故在子組件上觸發(fā)了父組件的input事件,通過觸發(fā)事件來進行傳值,實現(xiàn)了父子組件數(shù)據(jù)的雙向綁定,相對于直接使用v-bind以及自定義事件代碼量有所減少
原理:
首先我們?yōu)槊總€vue屬性用Object.defineProperty()實現(xiàn)數(shù)據(jù)劫持,為每個屬性分配一個訂閱者集合的管理數(shù)組dep;然后在編譯的時候在該屬性的數(shù)組dep中添加訂閱者,v-model會添加一個訂閱者,{{}}也會,v-bind也會,只要用到該屬性的指令理論上都會,接著為input會添加監(jiān)聽事件,修改值就會為該屬性賦值,觸發(fā)該屬性的set方法,在set方法內(nèi)通知訂閱者數(shù)組dep,訂閱者數(shù)組循環(huán)調(diào)用各訂閱者的update方法更新視圖。