前言:最近團隊需要做一個分享,腳進腦子,不知如何分享。最后想著之前一直想研究一下 vue 源碼,今天剛好 “借此機會” 研究一下。

網(wǎng)上研究vue數(shù)據(jù)綁定的文章已經(jīng)非常多了,但是自己寫一遍,敲一遍demo和看別人的文章是完全不同的,so……搬運工來了

 

目前數(shù)據(jù)綁定主要有以下三種實現(xiàn)方式:

1.   臟值檢查(angular.js)    輪詢檢測數(shù)據(jù)變化

DOM事件,譬如用戶輸入文本,點擊按鈕等。( ng-click )

  • XHR響應(yīng)事件 ( $http )

  • 瀏覽器Location變更事件 ( $location )

  • Timer事件( $timeout , $interval )

  • 執(zhí)行 $digest() 或 $apply()

2、Object.defineProperty劫持對象的get、set,從而實現(xiàn)對數(shù)據(jù)的監(jiān)控。 (vue)

3、發(fā)布/訂閱者模式實現(xiàn)數(shù)據(jù)與視圖的自動同步

 

Object.defineProperty的優(yōu)點

  • “臟值檢測”——數(shù)據(jù)發(fā)生變更后,對于所有的數(shù)據(jù)和視圖的綁定關(guān)系進行一次檢測,識別是否有數(shù)據(jù)發(fā)生了改變,有變化進行處理,可能進一步引發(fā)其他數(shù)據(jù)的改變,所以這個過程可能會循環(huán)幾次,一直到不再有數(shù)據(jù)變化發(fā)生后,將變更的數(shù)據(jù)發(fā)送到視圖,更新頁面展現(xiàn) 

  • Object.defineProperty() 監(jiān)控對數(shù)據(jù)的操作,可以自動觸發(fā)數(shù)據(jù)同步。并且,由于是在不同的數(shù)據(jù)上觸發(fā)同步,可以精確的將變更發(fā)送給綁定的視圖,而不是對所有的數(shù)據(jù)都執(zhí)行一次檢測。

 

網(wǎng)友評論