国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue 源碼解析之虛擬Dom-render

2019-11-19 10:58:13
字體:
來源:轉載
供稿:網友

vue 源碼解析 --虛擬Dom-render

instance/index.jsfunction 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)

初始化先執行了 renderMixin 方法, Vue 實例化執行this._init, 執行this.init方法中有initRender()

renderMixininstallRenderHelpers( 將一些渲染的工具函數放在Vue 原型上)Vue.prototype.$nextTick = function (fn: Function) {  return nextTick(fn, this) }

仔細看這個函數, 在Vue中的官方文檔上這樣解釋

Vue 異步執行 DOM 更新。只要觀察到數據變化,Vue 將開啟一個隊列,并緩沖在同一事件循環中發生的所有數據改變。如果同一個 watcher 被多次觸發,只會被推入到隊列中一次。這種在緩沖時去除重復數據對于避免不必要的計算和 DOM 操作上非常重要。然后,在下一個的事件循環“tick”中,Vue 刷新隊列并執行實際 (已去重的) 工作。Vue 在內部嘗試對異步隊列使用原生的 Promise.then MessageChannel,如果執行環境不支持,會采用 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用于延遲執行一段代碼,它接受2個參數(回調函數和執行回調函數的上下文環境),如果沒有提供回調函數,那么將返回promise對象。

function flushCallbacks () { pending = false const copies = callbacks.slice(0) callbacks.length = 0 for (let i = 0; i < copies.length; i++) {  copies[i]() }}

這個flushCallbacks 是執行callbacks里存儲的所有回調函數。

timerFunc 用來觸發執行回調函數

先判斷是否原生支持promise,如果支持,則利用promise來觸發執行回調函數;
否則,如果支持MutationObserver,則實例化一個觀察者對象,觀察文本節點發生變化時,觸發執行 
所有回調函數。

如果都不支持,則利用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參數,用來處理節點變化的回調函數,observe方法中options參數characterData:設置true,表示觀察目標數據的改變

_render函數

通過執行 createElement 方法并返回的是 vnode,它是一個虛擬的 Node。

vnode = render.call(vm._renderProxy, vm.$createElement)

總結

以上所述是小編給大家介紹的vue 源碼解析之虛擬Dom-render,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丹凤县| 定安县| 宣恩县| 怀化市| 华宁县| 湘潭市| 交城县| 凤冈县| 平潭县| 普陀区| 建湖县| 凌云县| 方山县| 安顺市| 南城县| 博野县| 三门县| 烟台市| 沭阳县| 镇赉县| 大渡口区| 剑川县| 游戏| 黑山县| 西宁市| 平顶山市| 扎鲁特旗| 乐安县| 格尔木市| 济宁市| 临湘市| 千阳县| 基隆市| 临安市| 铁岭市| 芷江| 贵阳市| 杭锦旗| 罗山县| 合山市| 太湖县|