new vue發生了什麼
此處只針對最簡單基礎的new vue過程,一般專案中採用.vue單檔案元件的形式開發,下面會介紹
對於 runtime+compile 版本:
初始化乙個 vue 例項的一系列相關環境(watcher,lifecycle, methods等等),
compile:將 template (若有)轉化成 render,在 render 過程中每乙個模板節點都會生成對應的 _c,也就是執行 createelement 函式
給例項註冊乙個渲染 watcher,渲染 watcher 擁有乙個**,該**函式會在初始化和每次 vm 例項更新時觸發,其中初始化的時候包含下面兩步驟:
利用 render 函式生成 vnode。 從根 vnode開始建立(處理邊界條件包括 textvnode,emptyvnode 等等),攤平所有 children vnode,children 拍平成一維陣列是為了建立好 tree 的資料結構,因為對於 tree 來說,每個節點的 children 就是一維陣列。最終建立成乙個 vnode tree。
開始執行 patch 過程,從根 vnode 起開始建立真實 dom,遞迴一整個 vnode tree,遞迴到最底層的時候開始將 vnode->el 插入到 parent vnode->el。patch 的遞迴過程是乙個自上 而下的過程,但是插入到 dom 節點的順序是自下而上,也就是子節點先插入,父節點後插入。 也就是當每乙個真實 dom 插入到父親 dom 節點的時候,當前這個 dom 節點會 是乙個構建好的 dom tree。
vue例項patch, 此處其實是進入了createcomponent,執行 元件 vnode 的 init hook
init hook中, 元件vnode例項化,執行構造器的init方法,本質是vm._init, 只是vm指向元件例項
元件例項_init 過程, 執行initinternalcomponent ,初始化元件例項的$options,parent指向 vue例項,_parentnode指向元件vnode
元件例項初始化生命週期,$parent 指向 vue例項,且 新增自身到 vue例項 children,完成父子關係繫結
元件例項化完成,例項儲存在元件vnode的componentinstance,元件例項執行$mount 掛載
由於vue-loader編譯完成已經有了render函式,執行 _render過程,建立元件例項vnode(渲染vnode)
_render過程, vm.vnode=vm.vnode = vm.vnode=vm.options._parentnode ,將佔位vnode儲存在 元件例項vm的$vnode
執行元件例項 _update , vm._vnode = vnode 將渲染vnode儲存在 _vnode屬性,執行元件例項 _patch
普通節點,直接進入createelm 過程,建立真實dom儲存到渲染vnode的elm,建立子節點,遞迴執行createelm
1、parent:當前子元件的父vm的例項(當前啟用的元件例項)
2、_parentvnode:佔位符vnode
3、activeinstance:當前vm的例項
4、例項下的 $children 儲存的是所有子元件 vm 例項
5、例項下的 $parent 儲存的是父元件 vm 例項
6、例項下的 $vnode 屬性就對應每個元件在父元件中的佔位符 vnode,因此對於根來說 $vnode 就是 null,佔位符 vnode 的主要屬性都在 componentoptions 下。
7、例項下的 _vnode 屬性就是對應每個元件下的實際渲染 root vnode(該 vnode 含一維陣列 children 屬性,遞迴構建成 vnode tree,其中對於元件將會採用佔位符 vnode)。
Vue原始碼學習筆記
最近偷懶好久沒有寫部落格了,一直想繼續vue學習系列,想深入vue原始碼來寫。結果發現自己層次不夠,對js的理解差好多。所以一直想寫一直擱置著。最近重新振作決心看完vue原始碼,並且以我們這類前端小白的角度來一步步弄懂vue原始碼。vue.js 本質上就是乙個包含各種邏輯的乙個function。而我...
vue原始碼學習筆記
最近在看vue的原始碼,因為本人比較小白,所以很多地方理解起來會有一定難度,好在有很多大分享了vue原始碼相關的文章,整理一下吧 vue.js 原始碼學習筆記 囧克斯,這篇文章是老師推薦的,裡面總結了vue原始碼中比較值得關注的地方,不過文章應該寫的比較早了,文中講的vue是以前的版本,檔案結構會和...
vue原始碼學習 vm forceUpdate方法
vue原始碼版本為2.6.11 cdn位址為 如何實現的?只需要執行watcher的update方法,就可以讓例項重新渲染。vue.js的每乙個例項都有乙個watcher。當狀態發生改變時,會通知到元件級別,然後元件內部使用虛擬dom進行更詳細的重新渲染操作。事實上,元件就是vue.js例項,所以元...