淺談 Vue v-model指令的實現原理,vuev-model
vue的v-model是一個十分強大的指令,它可以自動讓原生表單組件的值自動和你選擇的值綁定,
我們來看一下它的效果:
輸入框的值和一個資料是綁定的,輸入框的值變化,和他綁定的值也會發生變化
我們可以參照官方文檔的例子 http://cn.vuejs.org/v2/guide/forms.html#文本
我們在手動輸入 hello的過程中 下面和他綁定的p標籤的值也是即時變化的
如此神奇的效果是如何?的呢? 還是參照官方文檔
http://cn.vuejs.org/v2/guide/components.html#使用自訂事件的表單輸入組件
官方也說明了,v-model只不過是一個文法糖而已,真正的實現靠的還是
- v-bind:綁定響應式資料
- 觸發 input 事件 並傳遞資料 (核心和重點)
現在我們也想設計自己的表單組件,也想通過 v-model暴露組件的值,怎麼做呢?
例如我們要設計一個 自訂貨幣輸入的組件, 通過 v-model暴露組件的值,我們可能使用如下的組件代碼
<currency-input v-model="price"></currency-input>
然後再使用 這個我們自己定義的組件時, 組件內部會暴露出 組件的值到 v-model所綁定的值中去;那它是如何?的呢?\
要搞明白v-model的實現,需要通過查看官方的自訂v-model組件樣本的部分代碼來進行說明
我們看中的代碼,有行 $emit的代碼,這行代碼實際上會觸發一個 input事件, 'input'後的參數就是傳遞給v-model綁定的屬性的值,也就是說 v-model實現自訂的資料繫結的原理是這樣的:
首先,大體的組件結構:
<custom-comp v-model="myattr"> <input /> ?? <select> ?? </custom-comp>
也就是自訂的組件內部一般包含原生的表單組件(當然非表單的組件也可以)
然後,給原生控制項綁定事件,捕捉到原生組件的值,利用 $emit方法,觸發input方法,組件監聽到 input事件然後把值傳入到myattr中.
這裡有個疑問,為什麼是 'input'呢??? 三個字,看文檔!
這個就是 vue對 v-model實現的一個規則: 使用了v-model的組件會
自動監聽 input 事件,並把這個input事件所攜帶的值 傳遞給v-model所綁定的屬性!這樣組件內部的值就給到了父組件了
通過以上講解,我們總結一下如何利用v-model實現自訂的表單組件:
監聽原生組件的事件,當擷取到原生組件的值後把 值通過調用 $emit('input' ,data) 方法去觸發 input事件
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。