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