vue的生命周期鉤子與父子組件的生命周期詳解
vue的生命周期鉤子的介紹
vue官網(wǎng)中提供的vue的生命周期鉤子圖
vue的生命周期可以分為8個階段:
1、創(chuàng)建vue實例涉及的兩個鉤子
(1)beforeCreate:創(chuàng)建前,vue實例初始化之前調(diào)用。
此時的數(shù)據(jù)觀察和事件配置都還沒有準(zhǔn)備好,而此時的實例中的data和el還是underfined狀態(tài),不可用的。Dom元素也未加載,此時還不能操作dom元素
(2)created:創(chuàng)建后,vue實例初始化之后調(diào)用
此時實例創(chuàng)建完成,可以訪問data、mothods等屬性。但是此時組件還沒有掛載到頁面上,所以依然不能訪問dom元素。此階段可以進(jìn)行一個數(shù)據(jù)請求的操作。
2、組件掛載到頁面涉及的兩個鉤子:
(1)beforeMount:掛載前,掛載到DOM樹之前調(diào)用。相關(guān)的 render 函數(shù)首次被調(diào)用。
在beforeMount之前,會找到對應(yīng)的template,并編譯成render函數(shù)。
(2)mounted:掛載后,掛載到DOM樹之后調(diào)用
此時可以通過Dom API操作DOM元素
3、組件更新涉及的兩個鉤子
(1)beforeupdate:更新前,在數(shù)據(jù)發(fā)生改變后,DOM 被更新之前被調(diào)用。
此時,可以對可能會被移除的元素做一些操作,比如移除事件監(jiān)聽等
(2)updated:更新后,在數(shù)據(jù)更改導(dǎo)致的虛擬 DOM 重新渲染和更新完畢之后被調(diào)用
此時,組件 DOM 已經(jīng)更新。
4、組件銷毀涉及的兩個鉤子
(1)beforeDestroy:銷毀前,vue實例銷毀之前調(diào)用
一般在這一步,可以銷毀定時器,解綁全局事件等。
(2)destroyed:銷毀后,vue實例銷毀之后調(diào)用
該鉤子被調(diào)用后,對應(yīng) Vue 實例的所有指令都被解綁,所有的事件監(jiān)聽器被移除,所有的子實例也都被銷毀。
值得注意的是,在使用keep-alive時,組件還會涉及兩外兩個鉤子
(1)actived:被 keep-alive 緩存的組件激活時調(diào)用。
(2)被 keep-alive 緩存的組件失活時調(diào)用。
父子組件的生命周期
加載渲染過程
父beforeCreate→父created→父beforeMount→子bereforeCreate→子created→子beforeMound→子mounted→父mounted
父組件更新過程
點擊“父組件更新”按鈕
執(zhí)行的生命周期鉤子:父beforeUpdate→父updated
子組件更新過程
點擊‘子組件更新’按鈕:
執(zhí)行的生命周期鉤子:子befforeUpdate→子updated
父子組件更新過程
點擊‘改變value’按鈕
執(zhí)行的生命周期鉤子:父beforeUpdate→子beforeUpdate→子updated→父updated
銷毀過程
銷毀是執(zhí)行的生命周期鉤子:父beforeDestroy→子beforeDestroy→子destroyed→父destroyed
代碼示例
Lifecycle.vue
<template> <div> Lifecycle <button @click="changeValue">改變value</button> <br /> <br /> <br /> <parent :value="value"></parent> </div> </template> <script> import Parent from "./Parent.vue"; export default { name: "Lifecycle", components: { Parent }, data() { return { value: 0, }; }, methods: { changeValue() { this.value++; }, }, }; </script>
Parent.vue
<template> <div> <p>Parent-{{ parentData }}</p> <p>Parent-value:{{ value }}</p> <button @click="changeParentData">父組件更新</button> <br /> <br /> <br /> <Child :value="value"></Child> </div> </template> <script> import Child from "./Child.vue"; export default { name: "Parent", props: ["value"], components: { Child }, data() { return { parentData: 0, }; }, methods: { changeParentData() { this.parentData++; }, }, // 創(chuàng)建vue實例前 beforeCreate() { console.log("parent beforeCreate 方法執(zhí)行了"); }, // 創(chuàng)建vue實例后 created() { console.log("parent created 方法執(zhí)行了"); }, // 掛載前 beforeMount() { console.log("parent beforeMount 方法執(zhí)行了"); }, // 掛載后 mounted() { console.log("parent mounted 方法執(zhí)行了"); }, // 更新前 beforeUpdate() { console.log("parent beforeUpdate 方法執(zhí)行了"); }, // 更新后 updated() { console.log("parent updated 方法執(zhí)行了"); }, // 銷毀前 beforeDestroy() { console.log("parent beforeDestroy 方法執(zhí)行了"); }, // 銷毀后 destroyed() { console.log("parent destroyed 方法執(zhí)行了"); }, }; </script>
child.vue
<template> <div> <p>Child-{{ childData }}</p> <p>Child-value:{{ value }}</p> <button @click="changeChildData">子組件更新</button> </div> </template> <script> export default { name: "Child", props: ["value"], data() { return { childData: 0, }; }, methods: { changeChildData() { this.childData++; }, }, // 創(chuàng)建vue實例前 beforeCreate() { console.log("Child beforeCreate 方法執(zhí)行了"); }, // 創(chuàng)建vue實例后 created() { console.log("Child created 方法執(zhí)行了"); }, // 掛載前 beforeMount() { console.log("Child beforeMount 方法執(zhí)行了"); }, // 掛載后 mounted() { console.log("Child mounted 方法執(zhí)行了"); }, // 更新前 beforeUpdate() { console.log("Child beforeUpdate 方法執(zhí)行了"); }, // 更新后 updated() { console.log("Child updated 方法執(zhí)行了"); }, // 銷毀前 beforeDestroy() { console.log("Child beforeDestroy 方法執(zhí)行了"); }, // 銷毀后 destroyed() { console.log("Child destroyed 方法執(zhí)行了"); }, }; </script>
created和mounted的區(qū)別
created創(chuàng)建vue實例之后,此時完成了數(shù)據(jù)檢測和事件及配置,可以訪問data數(shù)據(jù),可以進(jìn)行網(wǎng)絡(luò)請求。created是在模板渲染成html前調(diào)用,所以不能進(jìn)行dom操作
mounted是組件掛載完畢,模板渲染成html之后調(diào)用,可以進(jìn)行dom相關(guān)的操作。
到此這篇關(guān)于vue的生命周期鉤子與父子組件的生命周期詳解的文章就介紹到這了,更多相關(guān)vue生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用provide/inject實現(xiàn)跨組件通信的方法
在 Vue 應(yīng)用中,組件間通信是構(gòu)建復(fù)雜應(yīng)用時的一個常見需求,Vue3.x 提供了provide和inject API,讓跨組件通信變得更加簡潔和高效,本文將深入探討如何使用provide和inject在Vue3.x中實現(xiàn)跨組件通信,并通過示例代碼一步步進(jìn)行說明,需要的朋友可以參考下2024-03-03在vue中created、mounted等方法使用小結(jié)
這篇文章主要介紹了在vue中created、mounted等方法使用小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07Vue3+X6流程圖實現(xiàn)數(shù)據(jù)雙向綁定詳解
這篇文章主要為大家詳細(xì)介紹了Vue3如何結(jié)合X6流程圖實現(xiàn)數(shù)據(jù)雙向綁定,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03如何使用el-table+el-tree+el-select動態(tài)選擇對應(yīng)值
小編在做需求時,遇到了在el-table表格中加入多條數(shù)據(jù),并且每條數(shù)據(jù)要通過el-select來選取相應(yīng)的值,做到動態(tài)選擇,下面這篇文章主要給大家介紹了關(guān)于如何使用el-table+el-tree+el-select動態(tài)選擇對應(yīng)值的相關(guān)資料,需要的朋友可以參考下2023-01-01在vue中使用SockJS實現(xiàn)webSocket通信的過程
最近接到一個業(yè)務(wù)需求,需要做一個聊天信息的實時展示的界面,下面小編把實現(xiàn)過程記錄下來,對vue中使用SockJS實現(xiàn)webSocket通信的相關(guān)知識感興趣的朋友一起看看吧2018-08-08