v-model用于表單數(shù)據(jù)的雙向綁定,其實它就是一個語法糖,這個背后就做了兩個操作:
v-bind綁定一個value屬性
v-on指令給當(dāng)前元素綁定input事件
自定義組件使用v-model,應(yīng)該有以下操作:
接收一個value prop
觸發(fā)input事件闹击,并傳入新值
在原生表單元素中:
<input v-model="inputValue">
相當(dāng)于
<input v-bind:value="inputValue" v-on:input="inputValue = $event.target.value">
在自定義組件中
<my-component v-model="inputValue"></my-component>
<my-component v-model="inputValue"></my-component>
相當(dāng)于
<my-component v-bind:value="inputValue" v-on:input="inputValue = argument[0]"></my-component>
這個時候,inputValue接受的值就是input事件的回調(diào)函數(shù)的第一個參數(shù),所以在自定義組件中国葬,要實現(xiàn)數(shù)據(jù)綁定,還需要$emit去觸發(fā)input的事件芹壕。
this.$emit('input', value)
vue 在父子組件傳值時汇四,除了傳統(tǒng)的父組件 :屬性去傳值外,還可以使用 父組件v-model傳值踢涌,子組件props[‘value’]接收通孽,而子組件也可以通過$emit(‘input’,false),去改變父組件中v-model 和 子組件中 value 的值 睁壁。
代碼本質(zhì)上是<input :value=“test” @input=“test = $event.target.value”>背苦,其中@input是對輸入事件的一個監(jiān)聽:value="test"是將監(jiān)聽事件中的數(shù)據(jù)放入到input互捌。在這邊需要強調(diào)一點,v-model不僅可以給input賦值還可以獲取input中的數(shù)據(jù)行剂,而且數(shù)據(jù)的獲取是實時的秕噪,因為語法糖中是用@input對輸入框進(jìn)行監(jiān)聽的。