vue生命週期示例圖
上圖描述了vue 的生命週期,下面我們根據此圖來詳細瞭解下vue從初始化到結束都做了些什麼。
1. 創生created
對vue熟悉的人都知道,vue是封裝在vue的函式中的,
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)//初始化開始
}
複製程式碼
當我new vue時候,此時vue開始他的生命旅程。此時呼叫init函式,初始化vue的事件,props,methods,data,computed和watch **
2. 掛載mount
資料初始結束後,如果可以找到el則開始掛載DOM元素。
開始編譯:此時判斷是否有render函式,如果有就不做處理直接執行mount.call(this, el, hydrating)。如果沒有render函式,則獲取template,template可以是#id、模板字串、dom元素,如果沒有template,則獲取el以及其子內容作為模板,然後開始編譯模板,編譯完成呼叫render函式生成DOM元素。現在我們可以看到頁面顯示的內容了。
3. 更新update
頁面繫結的資料修改後,更新dom結構,即vdom的diff演算法。Vue和React在更新dom時,使用的演算法相同,都是基於snabbdom。 update中最終要的一環便是資料patch,vue中呼叫patch方法來分析DOM元素的結構變化。下面簡述下patch流程:
return function patch (oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) {
... let isInitialPatch = false const insertedVnodeQueue = []
if (isUndef(oldVnode)) {
...
} else {
// oldValue不是VNode,而是真實的dom元素 const isRealElement = isDef(oldVnode.nodeType)
if (!isRealElement && sameVnode(oldVnode, vnode)) {
//判斷兩個vnode可不可以複用為一個節點
// patch existing root node patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly)
//執行patchVnode方法 } else {
// }
invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch) return vnode.elm }
複製程式碼
vue中的update是vue知識點中比較重要的知識,此生命週期中最重要的是diff演算法。由於內容較多這裡就不詳述,有興趣的小夥伴可以去了解下[vue原始碼分析](https://github.com/liutao/vue2.0-source/blob/master/patch%E2%80%94%E2%80%94diff.md)
4. 結束destroy
任何事物有始必有終,vue當然也不例外。在vue中destroy用來結束他的生命週期,當離開當前元件時會自動觸發destroy,當然我們也可以手動觸發。
手動銷燬vue需要注意:destroy會完全銷燬一個例項。清理它與其它例項的連線,解綁它的全部指令及事件監聽器。也就是說他不會刪除頁面的DOM元素。