1. 程式人生 > 其它 >vue2與vue3中生命週期執行順序的區別

vue2與vue3中生命週期執行順序的區別

技術標籤:vue3vue

生命週期比較

vue2 中 執行順序 beforeCreate=>created=>beforeMount =>mounted=>beforeUpdate =>updated=>beforeDestroy=>destroyed
vue3 中 執行順序 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中beforeCreatecreated 但是的執行在beforeCreatecreated之前,所以setup無法使用 data 和 methods 中的資料和方法,即無法操作this

,setup中的this等於 undefined,又因為setup中建立的變數與方法最後都要通過return返回出去,所以setup中的程式只能是同步的,而不能是非同步;
vue3中 如果要使用vue2的beforeDestroydestroyed需要把名稱分別改為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執行在beforeCreatecreated前面;
onBeforeMount執行在beforeMount前面;
onMounted執行在mounted前面;

點選 更新name
在這裡插入圖片描述
可以看出vue3中,
onBeforeUpdate執行在beforeUpdate前面;
onUpdated執行在updated前面;
點選 切換child子元件的顯示
在這裡插入圖片描述

可以看出vue3中,
onBeforeUnmount執行在beforeDestroy前面;
onUnmounted執行在destroyed前面;