亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Vue之Watcher源碼解析(2)

2019-11-19 16:02:27
字體:
來源:轉載
供稿:網友

接著上節Vue Watcher源碼的話,繼續探討,目前是這么個過程:

函數大概是這里:

// line-3846  Vue.prototype._render = function() {    // 獲取參數    try {      // 死在這兒      vnode = render.call(vm._renderProxy, vm.$createElement);    } catch (e) {      // 報render錯誤    }    // return empty vnode in case the render function errored out    if (!(vnode instanceof VNode)) {      // 返回空節點    }    // set parent    vnode.parent = _parentVnode;    return vnode  };

然后,在上個月,我卡死在了render.call這個函數上面,因為所有vue實例被設置了proxy代理,所以會跳轉到各種奇怪的檢測函數中。

過了一個月,我依然看不懂,一點都不想講,所以先跳過,直接看后面!

這里假設vnode已經返回了,來看看是個啥:

這是一個虛擬節點,由之前字符串化后的DOM樹生成,主要包含子節點、上下文、屬性、文本、標簽名、類型等屬性,這些可以直接從鍵名判斷。

得到vnode后,由于這里是根節點,所以不存在_parentVnode,直接返回。

然后到了mountComponent函數:

// line-2374  function mountComponent(vm, el, hydrating) {    vm.$el = el;    // error    callHook(vm, 'beforeMount');    var updateComponent;    /* istanbul ignore if */    if ("development" !== 'production' && config.performance && mark) {      updateComponent = function() {        // 開發者模式下的處理方式      };    } else {      // 重新進入這里      updateComponent = function() {        vm._update(vm._render(), hydrating);      };    }    vm._watcher = new Watcher(vm, updateComponent, noop);    hydrating = false;    // manually mounted instance, call mounted on self    // mounted is called for render-created child components in its inserted hook    if (vm.$vnode == null) {      vm._isMounted = true;      callHook(vm, 'mounted');    }    return vm  }

這樣,就帶著返回的vode進入了_update函數,開始正式渲染頁面。

函數如下:

// line-2374  Vue.prototype._update = function(vnode, hydrating) {    var vm = this;    if (vm._isMounted) {      callHook(vm, 'beforeUpdate');    }    // 保存原屬性    var prevEl = vm.$el;    var prevVnode = vm._vnode;    var prevActiveInstance = activeInstance;    activeInstance = vm;    vm._vnode = vnode;    // patch    if (!prevVnode) {      // 初始化渲染      vm.$el = vm.__patch__(        vm.$el, vnode, hydrating, false /* removeOnly */ ,        vm.$options._parentElm,        vm.$options._refElm      );    } else {      // 更新      vm.$el = vm.__patch__(prevVnode, vnode);    }    activeInstance = prevActiveInstance;    // update __vue__ reference    if (prevEl) {      prevEl.__vue__ = null;    }    if (vm.$el) {      vm.$el.__vue__ = vm;    }    // if parent is an HOC, update its $el as well    // HOC => High Order Component => 高階組件    if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {      vm.$parent.$el = vm.$el;    }    // updated hook is called by the scheduler to ensure that children are    // updated in a parent's updated hook.  };

由于是初次渲染,所以會進入第一個條件分支,并調用__patch__函數,傳入原生DOM節點、虛擬DOM、false三個參數。

__patch__在加載框架時候已經注入了,見代碼:

  // line-7526  // install platform patch function  Vue$3.prototype.__patch__ = inBrowser ? patch : noop;  // line-6968  var patch = createPatchFunction({    nodeOps: nodeOps,    modules: modules  });

這里,nodeOps為封裝的DOM操作操作方法,modules為屬性、指令等相關方法。

這個createPatchFunction函數的構造相當于一個模塊,里面包含大量的方法,但是最后不是返回一個對象包含內部方法的引用,而是返回一個函數,形式大概如下:

 // line-4762  function createPatchFunction() {    // fn1...    // fn2...    return function patch() {      // 調用內部方法fn1,fn2...    }  }

方法比較多,下次再講,邊跑流程邊看。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人免费网站在线看| 久久激情五月丁香伊人| 亚洲午夜国产成人av电影男同| 欧美—级a级欧美特级ar全黄| 成人激情免费在线| 91精品国产成人www| 尤物99国产成人精品视频| 国产精品福利在线观看网址| 亚洲国产欧美日韩精品| 亚洲国产91色在线| 欧美激情在线观看| 久久天天躁狠狠躁夜夜躁| 国产精品久久91| 国产精品青青在线观看爽香蕉| 亚洲精选在线观看| 欧美理论在线观看| 国产精品综合久久久| 国产91露脸中文字幕在线| 国产在线视频欧美| 欧美日韩一区二区免费在线观看| 国产精品免费一区| 国产一区欧美二区三区| 日日摸夜夜添一区| 亚洲欧美日韩久久久久久| 欧美成人四级hd版| 国产一区深夜福利| 成人网在线观看| 亚洲欧美另类在线观看| 亚洲影视九九影院在线观看| 国产成人久久久精品一区| 色综合影院在线| 久久精品成人欧美大片古装| 久久在线视频在线| 精品国产网站地址| 亚洲福利视频免费观看| 日韩亚洲成人av在线| 久久国产精品久久精品| 久久人人97超碰精品888| 狠狠久久五月精品中文字幕| 91免费精品视频| 欧美成人免费播放| 亚洲女人被黑人巨大进入| 欧美性开放视频| 91最新国产视频| 亚洲天堂视频在线观看| 久久精品国产2020观看福利| 成人黄色网免费| 成人欧美一区二区三区在线| 91精品在线国产| 色偷偷av亚洲男人的天堂| 国产成人一区三区| 日韩中文字幕av| 精品免费在线视频| 91精品国产九九九久久久亚洲| 国语自产精品视频在免费| 亚洲国产99精品国自产| 欧美日韩精品中文字幕| 国内精品美女av在线播放| 国产99在线|中文| 91精品视频一区| 午夜精品一区二区三区视频免费看| 精品无人区太爽高潮在线播放| 亚洲老头同性xxxxx| 国产97在线观看| 成人黄色av网站| 精品国产鲁一鲁一区二区张丽| 日韩有码在线视频| 亚洲人成网站777色婷婷| 久久频这里精品99香蕉| 91地址最新发布| 中文字幕日韩免费视频| 97精品在线观看| 久久韩剧网电视剧| 亚洲欧美日韩区| 精品视频在线播放| 最新亚洲国产精品| 国产精品久久久一区| 国产精品视频资源| 亚洲国产精品久久久久久| 日韩欧中文字幕| 久久久久久国产三级电影| 亚洲人高潮女人毛茸茸| 亚洲电影在线看| 欧美精品久久久久久久免费观看| 久久天天躁狠狠躁夜夜躁| 亚洲一区二区中文字幕| 国产精品亚洲激情| 成人午夜在线观看| 亚洲的天堂在线中文字幕| 4438全国亚洲精品在线观看视频| 色多多国产成人永久免费网站| 亚洲一区二区精品| 疯狂做受xxxx欧美肥白少妇| 国产成人精品久久二区二区| 国产mv免费观看入口亚洲| 色综合五月天导航| 亚洲人成电影在线观看天堂色| 日韩在线观看免费| www.国产精品一二区| 成人免费看片视频| 精品一区二区三区四区在线| 日本aⅴ大伊香蕉精品视频| 中文字幕欧美专区| 久久久久久亚洲精品不卡| 欧美情侣性视频| 亚洲欧美成人精品| 国产综合色香蕉精品| 日韩在线免费观看视频| 成人久久久久爱| 91精品国产综合久久香蕉的用户体验| 日韩精品极品毛片系列视频| 懂色av一区二区三区| 日韩一级裸体免费视频| 欧美乱妇高清无乱码| 亚洲一区二区少妇| 91国产视频在线| 91美女片黄在线观| 欧美成人精品激情在线观看| 亚洲男人天堂视频| 欧美性高潮在线| 国产精品自产拍在线观看中文| 久久国产精品视频| 久久久久久久久久久免费| 亚洲影院色在线观看免费| 91九色精品视频| 69av视频在线播放| 日韩精品在线影院| 搡老女人一区二区三区视频tv| 国产午夜精品全部视频播放| 欧美中文在线视频| 国产欧美日韩高清| 欧美激情免费在线| 91精品国产91久久久久福利| 国产精品女视频| 亚洲一区二区三区视频| 日韩在线观看视频免费| 亚洲毛片在线观看.| 91国自产精品中文字幕亚洲| 米奇精品一区二区三区在线观看| 91综合免费在线| 国产亚洲精品久久| 亚洲精品美女久久久久| 国产精品www| 国产精品美女久久| 国产不卡av在线| 欧美精品免费在线| 亚洲日韩中文字幕在线播放| 亚洲欧美日韩一区在线| 97免费视频在线播放| 国产成人亚洲综合91精品| 欧美老少做受xxxx高潮| 91高潮在线观看| 亚洲精品97久久| 欧美一级淫片播放口| 国产精品夫妻激情| 国产精品欧美风情| 精品无人区太爽高潮在线播放| 在线丨暗呦小u女国产精品| 国产精品久久久久久久久久久不卡| 久久久女女女女999久久| 精品综合久久久久久97| 91丨九色丨国产在线| 国内精品一区二区三区| 国产91色在线播放|