VUE—生命週期的基本介紹
Vue生命週期:
什麼是生命週期:
Vue 例項從建立到銷燬的過程,就是生命週期。也就是從開始建立、初始化資料、編譯模板、掛載Dom→渲染、更新→渲染、解除安裝等一系列過程,我們稱這是 Vue 的生命週期。
什麼是鉤子函式:
因為過程都是分一個階段一個階段的並且都是相連的
生命週期的四個階段:
create(初始)、mount(載入)、update(更新)、destroy(銷燬)
生命週期的八個過程:
beforeCreate(){}
例項初始化之前 資料沒有載入 頁面沒有顯示,debugger; 斷點除錯,往往在這個階段做loading 請求狀態
create(){}
例項初始化後,請求到了資料,事件,屬性等,但是沒有載入,頁面依然沒有顯示,在這個階段,往往傳送 ajax請求,http請求
create---beforeMount之間 vue會在options中查詢有沒有el選項,有就把它作為模板,沒有就通過vm.$mount()去掛載,created之後有個判斷,先看你有沒有el屬性,在看看有沒有模板屬性,有模板屬性呢,就會把模板上的東西渲染出去,沒有模板屬性呢,就把el上的東西當做模板渲染出去,created-boforeMount的過程就是找模板,而模板都是虛擬的
beforeMount(){}
vue會將el對應的模板 加到$el中去,但是還沒有掛載出去,頁面沒有顯示
mounted(){}
頁面加載出來
beforeUpdate(){}
資料更新前,在虛擬dom中使用differ演算法,在記憶體中實現的,mounted之前的過程就不管了。如果想看屬性的變化,
在這個階段可以使用watch(屬性監聽)這個方法監聽屬性
update(){}
更新完了,在渲染,誰改變了渲染誰,不是整個dom樹重新渲染
beforeDestroy(){}
銷燬之前
destroy銷燬,例項銷燬需要人為觸發
銷燬:之前渲染好的保持不變,保留下來,後面再使用這個例項就不起作用了
Vm.$destroy() 進行銷燬
destroyed(){}
銷燬之後
簡述一下每個週期具體適合那些場景:
beforeDestroy:可以在這加個loading事件,在載入例項是觸發
created:初始化完成時的事件寫在這裡,如在這結束loading事件,非同步請求也適宜在這裡呼叫
mouted:掛載元素,獲取到DOM節點
updated:如果對資料統一處理,在這裡寫上相應函式
beforeDestroy:可以做一個確認停止事件的確認框
nextTick:更新資料後立即操作dom
巢狀元件的生命週期的執行順序:
vm.beforeCreate ——> vm.created ——> vm.beforeMount ——> son.beforeCreate ——> son.created ——> son.beforeMount ——> son.mounted ——> vm.mounted
更改元件資料 修改子元件的資料
vm.beforeCreate ——> vm.created ——> vm.beforeMount ——> son.beforeCreate ——> son.created ——> son.beforeMount ——> son.mounted ——> vm.mounted ——> son.beforeUpdate ——> son.updated
元件更新資料 只會呼叫自己的beforeUpdate 和 updated 不會影響到其他元件的更新鉤子
如果說父元件獲取的子元件中的標籤中的內容,這個內容會被子元件修改的,父元件獲取的都是修改前的,因為子元件的更新不會在去觸發父元件的mounted
this.$nextTick() 這個方法是元件中所有的鉤子執行完畢之後才會觸發(包括子元件)。
過程:
vm.beforeCreate ——> vm.created ——> vm.beforeMount ——> son.beforeCreate ——> son.created ——> son.beforeMount ——> son.mounted ——> vm.mounted ——> son.beforeUpdate ——> son.updated ——> this.$nextTick()
第一次頁面載入會觸發哪幾個鉤子?
第一次頁面載入時會觸發 beforeCreate, created, beforeMount, mounted 這幾個鉤子
DOM渲染在 哪個週期中就已經完成了?
DOM渲染在mounted中就已經完成了