天天看點

談談對vue中nextTick的了解

 在下次DOM更新循環結束之後執行回調 檔案位置 core/utils/next-tick

異步更新原理

  data屬性對應一個Dep

  Dep在資料通路get的時候觸發Dep.depend搜集watcher

  Dep在更改資料的時候set觸發Dep.notify便利觸發watcher更新(此處vue會調用nextTick,是以dom更新是異步的)

Vue并不會立即觸發watcher跟新dom(算是性能優化)。而是把具體的方法傳給nextTick的callback數組中,nextTick中包含watcher等更新dom方法以及使用者調用nextTick的回調函數

nextTick執行timeFunc函數(适配浏覽器promise => MutationObserve => setImmediate => setTimeout等異步任務),異步(promise等)回調執行flushCallbacks

nextTick方法

flushCallbacks方法

timeFunc主要是相容浏覽器

 nextTick為什麼定義pending鎖

  添加一個回調函數就關閉鎖,此時處于執行完同步代碼就執行異步代碼的情況,這個變量作用是隻開啟一個異步任務,仍然可以繼續添加回調函數,限制不開啟多個異步更新隊列

nextTick為什麼複制一份callback數組,回調函數隊列

  防止nextTick套用nextTick的情況,如果不做特殊處理會出現nextTick裡面的nextTick提前進入任務隊列,

  相當于下一個班車的乘客提前上了上一個班車(例子生動形象)

實作簡易版的nextTick