這種原理性問題 不要直接說不清楚 不了解
先講下使用
v-model本質上是一個語法糖,可以看成是value + input 方法的語法糖。可以通過model的prop屬性和event事件來進行自定義。
2、v-model是vue的雙向綁定的指令,能將頁面上控件輸入的值同步更新到相關綁定的data屬性, 也會在更新data綁定屬性時候,更新頁面上輸入控件的值。
然后再來講細節
vue的雙向綁定是由數據劫持結合發布者-訂閱者模式實現的,那么什么是數據劫持?vue是如何進行數據劫持的?說白了就是通過Object.defineProperty()來劫持對象屬性的setter和getter操作,在數據變動時做你想要做的事情
我們已經知道實現數據的雙向綁定,首先要對數據進行劫持監聽,所以我們需要設置一個監聽器Observer,用來監聽所有屬性。如果屬性發生變化了,就需要告訴訂閱者Watcher看是否需要更新。因為訂閱者是有很多個,所以我們需要有一個消息訂閱器Dep來專門收集這些訂閱者,然后在監聽器Observer和訂閱者Watcher之間進行統一管理的。接著,我們還需要有一個指令解析器Compile,對每個節點元素進行掃描和解析,將相關指令(如v-model,v-on)對應初始化成一個訂閱者Watcher,并替換模板數據或者綁定相應的函數,此時當訂閱者Watcher接收到相應屬性的變化,就會執行對應的更新函數,從而更新視圖。因此接下去我們執行以下3個步驟,實現數據的雙向綁定:
1.實現一個監聽器Observer,用來劫持并監聽所有屬性,如果有變動的,就通知訂閱者。
2.實現一個訂閱者Watcher,每一個Watcher都綁定一個更新函數,watcher可以收到屬性的變化通知并執行相應的函數,從而更新視圖。
3.實現一個解析器Compile,可以掃描和解析每個節點的相關指令(v-model,v-on等指令),如果節點存在v-model,v-on等指令,則解析器Compile初始化這類節點的模板數據,使之可以顯示在視圖上,然后初始化相應的訂閱者(Watcher)
3:最后補一下 vue2.0里面用Object.defineProperty 3.0里面用new Proxy 一個監聽每個屬性 一個監聽整個對象