在下次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