摘要:用于延遲執(zhí)行一段代碼,它接受個參數(shù)回調函數(shù)和執(zhí)行回調函數(shù)的上下文環(huán)境,如果沒有提供回調函數(shù),那么將返回對象。
instance/index.js
function Vue (options) { if (process.env.NODE_ENV !== "production" && !(this instanceof Vue) ) { warn("Vue is a constructor and should be called with the `new` keyword") } this._init(options) } renderMixin(Vue)
初始化先執(zhí)行了 renderMixin 方法, Vue 實例化執(zhí)行this._init, 執(zhí)行this.init方法中有initRender()
renderMixininstallRenderHelpers( 將一些渲染的工具函數(shù)放在Vue 原型上)
Vue.prototype.$nextTick = function (fn: Function) { return nextTick(fn, this) }
仔細看這個函數(shù), 在Vue中的官方文檔上這樣解釋
Vue 異步執(zhí)行 DOM 更新。只要觀察到數(shù)據變化,Vue 將開啟一個隊列,并緩沖在同一事件循環(huán)中發(fā)生的所有數(shù)據改變。如果同一個 watcher 被多次觸發(fā),只會被推入到隊列中一次。這種在緩沖時去除重復數(shù)據對于避免不必要的計算和 DOM 操作上非常重要。然后,在下一個的事件循環(huán)“tick”中,Vue 刷新隊列并執(zhí)行實際 (已去重的) 工作。Vue 在內部嘗試對異步隊列使用原生的 Promise.then 和MessageChannel,如果執(zhí)行環(huán)境不支持,會采用 setTimeout(fn, 0)代替。
export function nextTick (cb?: Function, ctx?: Object) { let _resolve callbacks.push(() => { if (cb) { try { cb.call(ctx) } catch (e) { handleError(e, ctx, "nextTick") } } else if (_resolve) { _resolve(ctx) } }) if (!pending) { pending = true timerFunc() } // $flow-disable-line if (!cb && typeof Promise !== "undefined") { return new Promise(resolve => { _resolve = resolve }) } }
Vue.nextTick用于延遲執(zhí)行一段代碼,它接受2個參數(shù)(回調函數(shù)和執(zhí)行回調函數(shù)的上下文環(huán)境),如果沒有提供回調函數(shù),那么將返回promise對象。
function flushCallbacks () { pending = false const copies = callbacks.slice(0) callbacks.length = 0 for (let i = 0; i < copies.length; i++) { copies[i]() } }
這個flushCallbacks 是執(zhí)行callbacks里存儲的所有回調函數(shù)。
timerFunc 用來觸發(fā)執(zhí)行回調函數(shù)
先判斷是否原生支持promise,如果支持,則利用promise來觸發(fā)執(zhí)行回調函數(shù);
否則,如果支持MutationObserver,則實例化一個觀察者對象,觀察文本節(jié)點發(fā)生變化時,觸發(fā)執(zhí)行
所有回調函數(shù)。
如果都不支持,則利用setTimeout設置延時為0。
const observer = new MutationObserver(flushCallbacks) const textNode = document.createTextNode(String(counter)) observer.observe(textNode, { characterData: true }) timerFunc = () => { counter = (counter + 1) % 2 textNode.data = String(counter) } isUsingMicroTask = true
MutationObserver是一個構造器,接受一個callback參數(shù),用來處理節(jié)點變化的回調函數(shù),observe方法中options參數(shù)characterData:設置true,表示觀察目標數(shù)據的改變
_render函數(shù)通過執(zhí)行 createElement 方法并返回的是 vnode,它是一個虛擬的 Node。
vnode = render.call(vm._renderProxy, vm.$createElement)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/106963.html
摘要:當前正在處理的節(jié)點,以及該節(jié)點的和等信息。源碼解析之一整體分析源碼解析之三寫作中源碼解析之四寫作中作者博客作者作者微博 筆者系 vue-loader 貢獻者之一(#16) 前言 vue-loader 源碼解析系列之一,閱讀該文章之前,請大家首先參考大綱 vue-loader 源碼解析系列之 整體分析 selector 做了什么 const path = require(path) co...
摘要:源碼解析這邊解析的是從樹轉換成函數(shù)部分的源碼,由于第一次提交的源碼這部分不全,故做了部分更新,代碼全在文件夾中。入口整個語法樹轉函數(shù)的起點是文件中的函數(shù)明顯看到,函數(shù)傳入參數(shù)為語法樹,內部調用函數(shù)開始解析根節(jié)點容器節(jié)點。 通過對 Vue2.0 源碼閱讀,想寫一寫自己的理解,能力有限故從尤大佬2016.4.11第一次提交開始讀,準備陸續(xù)寫: 模版字符串轉AST語法樹 AST語法樹轉r...
摘要:源碼解析這邊解析的是從樹轉換成函數(shù)部分的源碼,由于第一次提交的源碼這部分不全,故做了部分更新,代碼全在文件夾中。入口整個語法樹轉函數(shù)的起點是文件中的函數(shù)明顯看到,函數(shù)傳入參數(shù)為語法樹,內部調用函數(shù)開始解析根節(jié)點容器節(jié)點。 通過對 Vue2.0 源碼閱讀,想寫一寫自己的理解,能力有限故從尤大佬2016.4.11第一次提交開始讀,準備陸續(xù)寫: 模版字符串轉AST語法樹 AST語法樹轉r...
摘要:當字符串開頭是時,可以匹配匹配尾標簽。從結尾,找到所在位置批量閉合。 寫文章不容易,點個贊唄兄弟 專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內部詳情,讓我們一起學習吧研究基于 Vue版本 【2.5.17】 如果你覺得排版難看,請點擊 下面鏈接 或者 拉到 下面關注公眾號也可以吧 【Vue原理】Compile - 源碼版 之 標簽解析...
摘要:慢慢地,關于的原創(chuàng)學習文章已經寫了多篇了會一直放出來,目前篇,因此做一個合集,獻給那些對新版本腳手架使用和背后設計感興趣的同學,都是一步一步去看源碼,也給官方提了幾次,合進去了幾個原創(chuàng)不易,歡迎大家互相轉發(fā),期望大家一起快速過度到版本目錄 慢慢地,關于 Vue CLI 3 的原創(chuàng)學習文章已經寫了 20 多篇了(會一直放出來,目前 23 篇), 因此做一個合集,獻給那些對新版本腳手架使用...
閱讀 3118·2021-11-18 10:02
閱讀 3410·2021-11-02 14:48
閱讀 3453·2019-08-30 13:52
閱讀 619·2019-08-29 17:10
閱讀 2148·2019-08-29 12:53
閱讀 1471·2019-08-29 12:53
閱讀 1087·2019-08-29 12:25
閱讀 2225·2019-08-29 12:17