<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
beforeCreate
=>created
=>beforeMount
=>mounted
=>beforeUpdate
=>updated
=>beforeDestroy
=>destroyed
setup
=>onBeforeMount
=>onMounted
=>onBeforeUpdate
=>onUpdated
=>onBeforeUnmount
=>onUnmounted
對應關係
vue2->vue3
beforeCreate
->setup
created
-> setup
beforeMount
-> onBeforeMount
mounted
-> onMounted
beforeUpdate
-> onBeforeUpdate
updated
-> onUpdated
beforeDestroy
-> onBeforeUnmount
destroyed
-> onUnmounted
其中 vue3中的setup相當於vue2中beforeCreate 與created 但是的執行在beforeCreate 與created之前,所以setup無法使用 data 和 methods 中的資料和方法,即無法操作this,setup中的this等於 undefined,又因為setup中建立的變數與方法最後都要通過return返回出去,所以setup中的程式只能是同步的,而不能是非同步,除非return 後面只接受一個非同步物件,物件返回setup內定義的變數與方法,然後父元件使用Suspense標籤包裹非同步元件;
vue3中 如果要使用vue2的beforeDestroy與destroyed需要把名稱分別改為beforeUnmount,unmounted
如果vue3中同時使用了vue2的寫法,vue3的寫法會優先執行;
父元件App.vue
<template> <h1>App父級元件</h1> <button @click="childShow = !childShow">切換child子元件的顯示</button> <hr /> <child v-if="childShow" /> </template>
<script lang="ts"> import { defineComponent, reactive, ref } from "vue"; //引入子元件 import child from "./components/child.vue"; export default defineComponent({ name: "App", components: { child, }, setup() { const childShow = ref(true); return { childShow, }; }, }); </script>
<style> * { margin: 0; padding: 0; } </style>
子元件child.vue
<template> <h2>child 子級元件</h2> <h3>{{ name }}</h3> <button @click="updateName">更新name</button> </template> <script lang="ts"> import { defineComponent, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted, ref, } from "vue"; export default defineComponent({ name: "child", //vue2中的生命週期勾點 beforeCreate() { console.log("vue2 中的生命週期 beforeCreate"); }, created() { console.log("vue2 中的生命週期 created"); }, beforeMount() { console.log("vue2 中的生命週期 beforeMount"); }, mounted() { console.log("vue2 中的生命週期 mounted"); }, beforeUpdate() { console.log("vue2 中的生命週期 beforeUpdate"); }, updated() { console.log("vue2 中的生命週期 updated"); }, // vue2中的 beforeDestroy與 destroyed已經改名 無法使用 beforeUnmount() { console.log("vue2 中的生命週期 beforeDestroy(beforeUnmount)"); }, unmounted() { console.log("vue2 中的生命週期 destroyed(unmounted)"); }, setup() { console.log("vue3中的setup"); const name = ref("hhh"); const updateName = () => { name.value += "6……6………6"; }; onBeforeMount(() => { console.log("vue3 中的生命週期 onBeforeMount"); }); onMounted(() => { console.log("vue3 中的生命週期 onMounted"); }); onBeforeUpdate(() => { console.log("vue3 中的生命週期 onBeforeUpdate"); }); onUpdated(() => { console.log("vue3 中的生命週期 onUpdated"); }); onBeforeUnmount(() => { console.log("vue3 中的生命週期 onBeforeUnmount"); }); onUnmounted(() => { console.log("vue3 中的生命週期 onUnmounted"); }); return { name, updateName, }; }, }); </script>
執行起來的顯示效果
進入頁面 按f12 開啟偵錯 重新整理頁面
可以看出vue3中
setup
執行在beforeCreate與created前面;onBeforeMount
執行在beforeMount前面;onMounted
執行在mounted前面;點選 更新name
可以看出vue3中
onBeforeUpdate
執行在beforeUpdate前面;onUpdated
執行在updated前面;可以看出vue3中
onBeforeUnmount
執行在beforeDestroy前面;onUnmounted
執行在destroyed前面;生命週期:在建立一個vue範例時,會經歷一系列的初始化過程(Vue範例從建立到銷燬的過程),這個過程就是vue的生命週期。
Vue提供給開發者的一系列的回撥函數,方便我們新增自定義的邏輯,Vue的生命週期從建立到銷燬,重要的節點掛載資料更新。
獻上一波程式碼,看下各週期勾點函數的執行順序:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>vue生命週期學習</title> <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script> </head> <body> <div id="app"> <h1>{{message}}</h1> </div> </body> <script> var vm = new Vue({ el: '#app', data: { message: 'Vue的生命週期' }, beforeCreate: function() { console.group('------beforeCreate建立前狀態------'); console.log("%c%s", "color:red" , "el : " + this.$el); //undefined console.log("%c%s", "color:red","data : " + this.$data); //undefined console.log("%c%s", "color:red","message: " + this.message) }, created: function() { console.group('------created建立完畢狀態------'); console.log("%c%s", "color:red","el : " + this.$el); //undefined console.log("%c%s", "color:red","data : " + this.$data); //已被初始化 console.log("%c%s", "color:red","message: " + this.message); //已被初始化 }, beforeMount: function() { console.group('------beforeMount掛載前狀態------'); console.log("%c%s", "color:red","el : " + (this.$el)); //已被初始化 console.log(this.$el); console.log("%c%s", "color:red","data : " + this.$data); //已被初始化 console.log("%c%s", "color:red","message: " + this.message); //已被初始化 }, mounted: function() { console.group('------mounted 掛載結束狀態------'); console.log("%c%s", "color:red","el : " + this.$el); //已被初始化 console.log(this.$el); console.log("%c%s", "color:red","data : " + this.$data); //已被初始化 console.log("%c%s", "color:red","message: " + this.message); //已被初始化 }, beforeUpdate: function () { console.group('beforeUpdate 更新前狀態===============》'); console.log("%c%s", "color:red","el : " + this.$el.innerHTML); console.log(this.$el); console.log("%c%s", "color:red","data : " + this.$data); console.log("%c%s", "color:red","message: " + this.message); }, updated: function () { console.group('updated 更新完成狀態===============》'); console.log("%c%s", "color:red","el : " + this.$el.innerHTML); console.log(this.$el); console.log("%c%s", "color:red","data : " + this.$data); console.log("%c%s", "color:red","message: " + this.message); }, beforeDestroy: function () { console.group('beforeDestroy 銷燬前狀態===============》'); console.log("%c%s", "color:red","el : " + this.$el); console.log(this.$el); console.log("%c%s", "color:red","data : " + this.$data); console.log("%c%s", "color:red","message: " + this.message); }, destroyed: function () { console.group('destroyed 銷燬完成狀態===============》'); console.log("%c%s", "color:red","el : " + this.$el); console.log(this.$el); console.log("%c%s", "color:red","data : " + this.$data); console.log("%c%s", "color:red","message: " + this.message) } }) </script> </html>
(1)建立階段:初始化事件,進行資料的觀測
(2)掛載階段
(3)更新階段:觸發對應元件的重新渲染
(4)銷燬階段
<template> <div class="father"> <component-A class="son_A"></component-A> <component-B class="son_B"></component-B> </div> </template> // script部分同上程式碼,不多寫了。
主要可以從以下幾種情況分析:
(1)建立過程:
父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
(2)元件的內部更新:
子元件的內部更新過程是:子beforeUpdate->子updated
同理父元件的內部更新過程也是:父beforeUpdate->父updated
(3)元件之間的更新:
當子元件使用emit修改父元件狀態時,剛好這個狀態又繫結在子元件的props上,更新過程是:父beforeUpdate->子beforeUpdate->子updated->父updated
(4)父子元件銷燬:
父元件被銷燬時子元件也同時被銷燬,銷燬的勾點過程是:父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
父子元件完整的生命週期圖如下所示:
跳轉不同頁面和part2是相同的原理,從第一個頁面(index)跳轉到下一個頁面(secondIndex)時,回先初始化secondIndex,之後在執行index頁面的銷燬階段,最後secondIndex掛載完成.
題外話:
在開發過程中,通過對整個生命週期的瞭解,就可以很清晰地知道可以在什麼階段做什麼事,或者某一操作應該在什麼階段執行
例如在create中進行資料操作,在mounted中進行DOM完成後的操作,在destroyed進行事件解綁和功能登出
當然,對於元件間、不同頁面跳轉的生命週期順序也應該更加了解,避免頁面渲染資料錯誤或根本拿不到資料等情況
總結來說就是在合適的時機做對的事情,才能事半功倍嘛~
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45