vue生命週期詳解

2021-09-11 09:54:19 字數 3607 閱讀 2899

最近在寫業務的時候,總是會遇到一些和vue的生命週期相關的問題,比如: 你用ajax請求資料,然後將資料props到子元件的時候,因為ajax是非同步的,然後會發生沒有資料。然後查詢原因還是自己對這個東西理解不夠深入。

什麼是生命週期函式?

比如:

mounted: function() 

// 或者

mounted()

複製**

錯誤的形式:

mounted:() => 

複製**

在例項初始化之後,資料觀測和暴露了一些有用的例項屬性與方法。

例項初始化——new vue()

資料觀測——在vue的響應式系統中加入data物件中所有資料,這邊涉及到vue的雙向繫結,可以看官方文件上的這篇深度響應式原理 深度響應式原理

暴露屬性和方法——就是vue例項自帶的一些屬性和方法,我們可以看乙個官網的例子,例子中帶$的屬性和方法就是vue例項自帶的,可以和使用者定義的區分開來

var data = 

var vm = new vue()

vm.$data === data // => true

vm.$el === document.getelementbyid('example') // => true

// $watch 是乙個例項方法

vm.$watch('a', function (newvalue, oldvalue) )

複製**

// 有el屬性的情況下

new vue(,

created: function() ,

beforemount: function() ,

mounted: function()

})// 輸出結果

// 呼叫了beforecreate

// 呼叫了created

// 呼叫了beforemount

// 呼叫了mounted

複製**

// 在沒有el屬性的情況下,沒有vm.$mount

new vue(,

created: function() ,

beforemount: function() ,

mounted: function()

})// 輸出結果

// 呼叫了beforecreate

// 呼叫了created

複製**

// 在沒有el屬性的情況下,但是有vm.$mount方法

var vm = new vue(,

created: function() ,

beforemount: function() ,

mounted: function()

})// 輸出結果

// 呼叫了beforecreate

// 呼叫了created

// 呼叫了beforemount

// 呼叫了mounted

複製**

這裡面分三種情況:

1、在例項內部有template屬性的時候,直接用內部的,然後呼叫render函式去渲染。 2、在例項內部沒有找到template,就呼叫外部的html。例項內部的template屬性比外部的優先順序高。 3、要是前兩者都不滿足,那麼就丟擲錯誤。

我們來看以下幾個例子:

new vue()

//頁面上渲染出了hello world

複製**

new vue()

// 頁面上渲染出了hello world

複製**

//兩者都存在的時候

new vue()

// 頁面上渲染出了hello world1

複製**

從上述的例子可以看出內部的優先外部的。

2、實際上,vue例項中還有一種render選項,我們可以從文件上看一下他的用法:

new vue(

})複製**

3、上述三者的渲染優先順序:render函式 > template屬性 > 外部html

4、vue編譯過程——把tempalte編譯成render函式的過程。

我們先來看乙個例子:

}new vue(,

beforemount: function

() ,

mounted: function

() })

// 輸出的結果:

// 呼叫了beforemount

// 1

// //

// 呼叫了mounted

// 1

//

// 複製**

建立vue例項的$el,然後用它替代el屬性。

這個過程中,我們會發現,當乙個資料發生改變時,你的檢視也將隨之改變,整個更新的過程是:資料改變——導致虛擬dom的改變——呼叫這兩個生命鉤子去改變檢視

// 沒繫結的情況

var vm = new vue(,

updated: function() ,

data:

})vm.a = 2

//這種情況在控制台中是什麼都不會輸出的。

複製**

var vm = new vue(,

updated: function() ,

data:

})vm.a = 2

// 輸出結果:

// 呼叫了beforeupdate

// 呼叫了uodated

複製**

在beferodestory生命鉤子呼叫之前,所有例項都可以用,但是當呼叫後,vue 例項指示的所有東西都會解繫結,所有的事件***會被移除,所有的子例項也會被銷毀。

let vm = new vue(,

', beforecreate

() ,

created

() ,

beforemount

() ,

mounted

() ,

beforeupdate

() ,

updated

() ,

beforedestory

() ,

destoryed

() })

vm.message = 2

複製**

// 呼叫了beforecreate

// undefined

// undefined

// 呼叫了created

// 1

// undefined

// 呼叫了beforemount

// 1

// // 呼叫了mounted

// 1

// 呼叫了beforeupdate

// 2

// 呼叫了updated

// 2

複製**

vue生命週期詳解

vue生命週期分為八個階段 建立前後 掛載前後 更新前後 銷毀前後 beforecreate和create鉤子函式間的生命週期 檢測資料,來檢測資料是否變化了,然後初始化事件 create和beforemount鉤子函式間的生命週期 首先判斷有沒有el選項 1.如果沒有的話就暫時停止了生命週期,等待...

vue生命週期詳解

beforecreate 第乙個生命週期函式,表示例項完全被建立出來之前,會執行它 注意 在 beforecreate 生命週期函式執行的時候,data 和 methods 中的 屬性與方法定義都還沒有沒初始化 created 第二個生命週期函式,在 created 中,data 和 methods...

詳解vue生命週期

vue的宣告週期 鉤子函式 共有8個,分別是 此時還會檢查是否有繫結el 例項的容器 如果有,就會接著檢查是否有template模板 如果沒有,還會檢查例項上有沒有.mount屬性 在main.js的例項,如圖1 假設el或者 mount有其中乙個,那麼就會入檢查template的環節,否則結束生命...