當面試官問:「談談你對vue的生命週期的理解」,聽到這句話你是不是心裡暗自竊喜:這也太容易了吧,不就是beforecreate、created、beforemount、mounted、beforeupdate、updated、beforedestroy、destroyed 這幾個鉤子函式麼,建立=>掛載=>更新=>銷毀,so easy !!!
當然,甩張image給面試官這句話肯定是開玩笑的(適度幽默,緩解緊張氣氛)。不過這張流程圖還是有用的,因為它是我從vue官網上拷貝下來的,只要你能理解了這張圖,也就對vue的生命週期有了乙個大致的了解。那麼接下來,閏土大叔將手摸手教你如何深入淺出地說出令面試官滿意的、有亮點的回答。
在談到vue的生命週期的時候,我們首先需要建立乙個例項,也就是在 new vue ( ) 的物件過程當中,首先執行了init(init是vue元件裡面預設去執行的),在init的過程當中首先呼叫了beforecreate,然後在injections(注射)和reactivity(反應性)的時候,它會再去呼叫created。所以在init的時候,事件已經呼叫了,我們在beforecreate的時候千萬不要去修改data裡面賦值的資料,最早也要放在created裡面去做(新增一些行為)。
當created完成之後,它會去判斷instance(例項)裡面是否含有「el」option(選項),如果沒有的話,它會呼叫vm.$mount(el)這個方法,然後執行下一步;如果有的話,直接執行下一步。緊接著會判斷是否含有「template」這個選項,如果有的話,它會把template解析成乙個render function ,這是乙個template編譯的過程,結果是解析成了render函式:
render (h) , this.text)
}
解釋一下,render函式裡面的傳參h就是vue裡面的createelement方法,return返回乙個createelement方法,其中要傳3個引數,第乙個引數就是建立的div標籤;第二個引數傳了乙個物件,物件裡面可以是我們元件上面的props,或者是事件之類的東西;第三個引數就是div標籤裡面的內容,這裡我們指向了data裡面的text。
使用render函式的結果和我們之前使用template解析出來的結果是一樣的。render函式是發生在beforemount和mounted之間的,這也從側面說明了,在beforemount的時候,$el還只是我們在html裡面寫的節點,然後到mounted的時候,它就把渲染出來的內容掛載到了dom節點上。這中間的過程其實是執行了render function的內容。
在使用.vue檔案開發的過程當中,我們在裡面寫了template模板,在經過了vue-loader的處理之後,就變成了render function,最終放到了vue-loader解析過的檔案裡面。這樣做有什麼好處呢?原因是由於在解析template變成render function的過程,是乙個非常耗時的過程,vue-loader幫我們處理了這些內容之後,當我們在頁面上執行vue**的時候,效率會變得更高。
beforemount在有了render function的時候才會執行,當執行完render function之後,就會呼叫mounted這個鉤子,在mounted掛載完畢之後,這個例項就算是走完流程了。
後續的鉤子函式執行的過程都是需要外部的觸發才會執行。比如說有資料的變化,會呼叫beforeupdate,然後經過virtual dom,最後updated更新完畢。當元件被銷毀的時候,它會呼叫beforedestory,以及destoryed。
這就是vue例項從新建到銷毀的乙個完整流程,以及在這個過程中它會觸發哪些生命週期的鉤子函式。那說到這兒,可能很多童鞋會問,鉤子函式是什麼意思?
鉤子函式,其實和**是乙個概念,當系統執行到某處時,檢查是否有hook,有則**。說的更直白一點,每個元件都有屬性,方法和事件。所有的生命週期都歸於事件,在某個時刻自動執行。
其實,當你跟面試官闡述到這兒的時候,面試官基本上已經滿意你的回答了,隱約看到了你的技術功底。當然,如果你還想更進一步,讓面試官對你刮目相看,達到加分的效果,你還可以這樣說:
在這個過程當中,vue為我們提供了rendererror方法,這個方法只有在開發的時候它才會被呼叫,在正式打包上線的過程當中,它是不會被呼叫的。它主要是幫助我們除錯render裡面的一些錯誤。
rendererror (h, err) , err.stack)
}
有且只有當render方法裡面報錯了,才會執行rendererror方法。
所以我們主動讓render函式報個錯:
如圖所示,渲染出來的就是error資訊了。還有一點,rendererror只有在本元件的render方法報錯的情況下它才會被呼叫。
vue生命週期
beforecreate 元件例項剛剛被建立,屬性都沒有 create 例項已經建立完成,屬性已經繫結 beforemount 模板編譯之前 mounted 模板編譯之後 beforeupdate 元件更新之前 updated 元件更新完畢 beforedestroy 元件銷毀之前 destroye...
vue生命週期
vue把整個生命週期劃分為建立 掛載 更新 銷毀等階段,每個階段都會給一些 鉤子 讓我們來做一些我們想實現的動作。學習例項的生命週期,能幫助我們理解vue例項的運作機制,更好地合理利用各個鉤子來完成我們的業務 我們分別來看看這幾個階段 1.beforecreate 此階段為例項初始化之後,此時的資料...
Vue 生命週期
import vue from vue el root 沒有的話,使用render,繼續沒有,就把el的outerhtml編譯成模板 template temp data beforecreate created el是原來的el beforemount 渲染函式 render h this.tex...