vue2.0原理梳理

\color{red}{雙向綁定原理}

  • \color{red}{1. } 簡述:把data裏的各個屬性定義到組件實例上,
    定義時通過 object.defineProtery 在get裏收集依賴,在set裏寫下通知更新的代碼;
    當ui首次渲染時,來獲取各個狀態數據時,開始觸發收集依賴。 當狀態數據改變時,觸發更新通知。

  • \color{red}{2. } 細說就有 dep watch observe 三個類
    1.Dep類管理收集到的依賴 用一個subDep數組存儲一個屬性對應的要通知變更的watcher
    2.watcher 存儲屬性變化後要執行的函數,update裏執行 run,run裏執行getter
    3.Observer 把data裏的屬性通過Object.definePropety定義到組件實例上 ,定義響應性方法

  • \color{red}{3. } 首次渲染的過程
    1.定義了更新渲染的函數

    updateComponent = () => {
       vm._update(vm._render(), hydrating)
    }
    

    2.定義一個watcher 把更新函數存入

          new Watcher(vm, updateComponent, noop, {
       before () {
        if (vm._isMounted && !vm._isDestroyed) {
          callHook(vm, 'beforeUpdate')
         }
       }
    }, true /* isRenderWatcher */) 
    
    //  這個watcher 就是每個屬性會收集到的更新ui的watcher
    
    1. 在創建watcher的構造函數裏時調用get 就設置了全局的Dep.target,然後調用更新渲染函數,這裏就會觸發get收集依賴。

    4.調用更新渲染時 先把模板轉換ast,然後優化靜態動態節點 然後得到真正的渲染函數,
    在執行渲染函數時,獲取掛載在組件實例下的裏的狀態值,觸發屬性定義方法裏的get函數,
    然後收集到這個更新渲染的watcher依賴,渲染函數執行完成,獲取到vNode,然後執行patch進行虛擬dom的diff算法,然後渲染就完成了。

也就是首次渲染時收集依賴的過程被觸發

  • \color{red}{4. } 更新渲染的過程
    屬性變化 set裏對應屬性的依賴遍歷執行多個watcher,其中就有一個更新渲染的watcher
    由於模板的渲染函數已經生成了,就直接調用生成vnode,然後patch

下面是類似的渲染函數

  function() {
   var _vm = this
   var _h = _vm.$createElement
   var _c = _vm._self._c || _h
   return _c("div", { staticClass: "hello" }, [
     _c("span", [_vm._v(_vm._s(_vm.msg2 + "33333333") + " ")]),
         _vm._v(" "),
         _c("p", [_vm._v(_vm._s(_vm.msg + "4444444") + " ")])
         ])
          }

\color{red}{計算屬性實現原理}
1.遍歷computer對象,每個屬性實現構造一個 watcher ,把屬性對應的函
數傳遞給watcher的get方法,
2.在創建watcher時 get方法會被執行,get方法
裏訪問data裏的屬性時,會觸發對應屬性收集這個watcher爲自己要通知的依賴.
3.這樣當計算屬性依賴的data屬性改變時,就會調用這個watcher的update來 更新計算屬性的值

\color{red}{數組如何實現雙向綁定}
1.實現了一個叫arrayMethods的對象,它以數組原型爲原型
2.通過Def方法定 義了 pop push shift unshift splice sort 等方法屬性描述符中的value,每當這些方法被調用 ,收集的依賴就在這裏發出通知
3.data下數組屬性 把 影式原型prototype修改爲arrayMethods 對象,實現對push pop 等 方法的攔截;

\color{red}{vue.nexttick原理 }

vue.nexttick作用 渲染完成後執行,方便在裏面操作Dom.下面介紹原理
1.背景知識: vue程序裏有兩個隊列
異步watcher隊列,其中就包括ui更新的watcher,
nextTick回調註冊的函數數組
有一個執行異步watcher隊列的方法
2.如何觸發nextTick這個回調的
在把異步watcher 放進watcher隊列時,nextTick註冊了一個執行異步
watcher隊列的回調方法,它是nextTick回調函數數組的第一個元素。
在第一次註冊nextTick的回調函數時,執行nextTick回調的微任務就激活了。
等主流程執行完成,就開始執行微任務 ,於是nextTick註冊的回調
函數數組就按照順序執行了,
3.外部註冊的nextTick回調函數在數組的後面,執行異步watcher隊列的方法是回調函數數組的第一個元素,遍歷過程,所以就產生了渲染完成後執行外部註冊的nextTick回調函數的效果.
其實這裏不是真實的渲染,只是dom拼接掛載完成了,所以在nextTick裏能夠操作dom了
4.異步微任務採用什麼技術實現
微任務 採用promise muatationObserver setImmdiate
實現微任務,vue源代碼裏依次判斷哪個有效。如果都無效,最後採用的是settimeout 來達到異步效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章