1. 程式人生 > >【轉】Vue生命週期

【轉】Vue生命週期

Vue所有的生命週期鉤子自動繫結在this上下文到例項中,因此你可以訪問資料,對屬性和方法進行運算。這意味著你不能使用箭頭函式來定義一個生命週期方法。這是因為箭頭函式綁定了父上下文,因此this與你期待的Vue例項不同。

1、beforeCreate

  在例項初始化之後,資料觀測和event/watcher時間配置之前被呼叫。
  
2、created

  例項已經建立完成之後被呼叫。在這一步,例項已經完成以下的配置:資料觀測,屬性和方法的運算,watch/event事件回撥。然而,掛載階段還沒開始,$el屬性目前不可見。
  
3、beforeMount

  在掛載開始之前被呼叫:相關的render函式首次被呼叫。
  該鉤子在伺服器端渲染期間不被呼叫。
  
4、mounted

el被新建立的 vm.$el替換,並掛在到例項上去之後呼叫該鉤子函式。如果root例項掛載了一個文件內元素,當mounted被呼叫時vm.$el也在文件內。該鉤子在服務端渲染期間不被呼叫。
  
5、beforeUpdate

  資料更新時呼叫,發生在虛擬DOM重新渲染和打補丁之前。
  你可以在這個鉤子中進一步第更改狀態,這不會觸發附加的重渲染過程。
  該鉤子在服務端渲染期間不被呼叫。
  
6、updated

  由於資料更改導致的虛擬DOM重新渲染和打補丁,在這之後會呼叫該鉤子。
  當這個鉤子被呼叫時,元件DOM已經更新,所以你現在可以執行依賴於DOM的操作。然而在大多數情況下,你應該避免在此期間更改狀態,因為這可能會導致更新無限迴圈。
  該鉤子在服務端渲染期間不被呼叫。
  
7、activated

  keep-alive元件啟用時呼叫。
  該鉤子在伺服器端渲染期間不被呼叫。
  
8、deactivated

  keep-alive元件停用時呼叫。
  該鉤子在服務端渲染期間不被呼叫。
  
9、beforeDestroy 【類似於React生命週期的componentWillUnmount】

  例項銷燬之間呼叫。在這一步,例項仍然完全可用。
  該鉤子在服務端渲染期間不被呼叫。
  
10、destroyed

  Vue例項銷燬後呼叫。呼叫後,Vue例項指示的所有東西都會解繫結,所有的事件監聽器會被移除,所有的子例項也會被銷燬。

  

 

含有keep-alive 生命週期鉤子:

在被keep-alive包含的元件/路由中,會多出兩個生命週期的鉤子: activated 與 deactivated。
在 2.2.0 及其更高版本中,activated 和 deactivated 將會在 樹內的所有巢狀元件中觸發。

activated在元件第一次渲染時會被呼叫,之後在每次快取元件被啟用時呼叫。


activated呼叫時機:

第一次進入快取路由/元件,在mounted後面,beforeRouteEnter守衛傳給 next 的回撥函式之前呼叫:

    beforeMount=> 如果你是從別的路由/元件進來(元件銷燬destroyed/或離開快取deactivated)=>
    mounted=> activated 進入快取元件 => 執行 beforeRouteEnter回撥

因為元件被快取了,再次進入快取路由/元件時,不會觸發這些鉤子:

   // beforeCreate created beforeMount mounted 都不會觸發。
  • 1

所以之後的呼叫時機是:

 元件銷燬destroyed/或離開快取deactivated => activated 進入當前快取元件 
    => 執行 beforeRouteEnter回撥
    // 元件快取或銷燬,巢狀元件的銷燬和快取也在這裡觸發
  • 1
  • 2
  • 3

deactivated:元件被停用(離開路由)時呼叫

使用了keep-alive就不會呼叫beforeDestroy(元件銷燬前鉤子)和destroyed(元件銷燬),因為元件沒被銷燬,被快取起來了。
這個鉤子可以看作beforeDestroy的替代,如果你快取了元件,要在元件銷燬的的時候做一些事情,你可以放在這個鉤子裡。
如果你離開了路由,會依次觸發:

 元件內的離開當前路由鉤子beforeRouteLeave =>  路由前置守衛 beforeEach =>
 全域性後置鉤子afterEach => deactivated 離開快取元件 => activated 進入快取元件(如果你進入的也是快取路由)

 // 如果離開的元件沒有快取的話 beforeDestroy會替換deactivated 
 // 如果進入的路由也沒有快取的話  全域性後置鉤子afterEach=>銷燬 destroyed=> beforeCreate等

 


關於生命週期鉤子需要注意的內容:

  • ajax請求最好放在created裡面,因為此時已經可以訪問this了,請求到資料就可以直接放在data裡面。
    這裡也碰到過幾次,面試官問:ajax請求應該放在哪個生命週期。

  • 關於dom的操作要放在mounted裡面,在mounted前面訪問dom會是undefined。

  • 每次進入/離開元件都要做一些事情,用什麼鉤子:

    (1)不快取:
    進入的時候可以用created和mounted鉤子,離開的時候用beforeDestory和destroyed鉤子,beforeDestory可以訪問this,destroyed不可以訪問this。

    (2)快取了元件:
    快取了元件之後,再次進入元件不會觸發beforeCreate、created 、beforeMount、 mounted,如果你想每次進入元件都做一些事情的話,你可以放在activated進入快取元件的鉤子中。
    同理:離開快取元件的時候,beforeDestroy和destroyed並不會觸發,可以使用deactivated離開快取元件的鉤子來代替。


觸發鉤子的完整順序:

將路由導航、keep-alive、和元件生命週期鉤子結合起來的,觸發順序,假設是從a元件離開,第一次進入b元件:

1- beforeRouteLeave:路由元件的元件離開路由前鉤子,可取消路由離開。

2- beforeEach: 路由全域性前置守衛,可用於登入驗證、全域性路由loading等。

3- beforeEnter: 路由獨享守衛

4- beforeRouteEnter: 路由元件的元件進入路由前鉤子。

5- beforeResolve:路由全域性解析守衛

6- afterEach:路由全域性後置鉤子

7- beforeCreate:元件生命週期,不能訪問this。

8- created:元件生命週期,可以訪問this,不能訪問dom。

9- beforeMount:元件生命週期

10- deactivated: 離開快取元件a,或者觸發a的beforeDestroy和destroyed元件銷燬鉤子。

11- mounted:訪問/操作dom。

12- activated:進入快取元件,進入a的巢狀子元件(如果有的話)。

13- 執行beforeRouteEnter回撥函式next。

 轉自https://blog.csdn.net/qq_24147051/article/details/81167093