Skip to content

生命周期

理解什么是生命周期

生命周期是组件(目前我们接触到的就是 App.vue 这个根组件)从创建到最终销毁所经历的一系列过程。在这个过程中设置了一些特殊的时间点,开发者可以在这些特殊的时间点,设置一些函数,这样的函数称之为钩子 🪝 函数,必须把开发者设置的钩子函数执行完毕后,才能继续走后面的流程。

这就让开发者有机会在特定的时段执行自己的业务逻辑代码。

完整的生命周期图如下:

lifecycle

快速入门

目前我们没有必要将上面所有的生命周期钩子函数都完全理解,先学习一个即可。

目前我们需要掌握的就是 mounted,mounted 对应的钩子函数为 onMounted,该钩子函数会在完成了初始化渲染并且创建和插入了 DOM 节点之后被触发,这意味着在当前的这个时间节点,你是可以访问真实的 DOM 元素的。

vue
<template>
  <div>
    <h1>用户列表</h1>
    <ul v-if="!loading">
      <li v-for="(user, index) in users" :key="index">
        {{ user.name }} - {{ user.email }}
      </li>
    </ul>
    <div v-if="loading">加载中...</div>
    <div v-if="error">出错啦!</div>
  </div>
</template>

<script setup>
import { ref, onMounted } from "vue";

const users = ref([]);
const loading = ref(false);
const error = ref(null);

onMounted(async () => {
  // 一般来讲,我们会在此生命周期钩子方法中请求数据
  loading.value = true;
  try {
    const res = await fetch("https://jsonplaceholder.typicode.com/users");
    if (res.ok) {
      users.value = await res.json();
    } else {
      throw new Error("请求失败");
    }
  } catch (err) {
    error.value = err.message;
  } finally {
    // 无论是出错也好,还是正常请求到了数据,都需要将 loading 状态改为 false
    loading.value = false;
  }
});
</script>

<style scoped></style>

完整的生命周期钩子方法:https://cn.vuejs.org/api/composition-api-lifecycle.html

Vue2 中的生命周期

注意,Vue3 中是支持 Vue2 的生命周期方法的,毕竟之前 Vue2 的选项式 API 的写法是作为一种风格继续存在于 Vue3 中的。

Vue2 以前的那些生命周期方法和 Vue3 是共存的,只不过名字有一些不一样,例如上面的 mounted 阶段对应的钩子方法:

  • Vue3:onMounted
  • Vue2:mounted

另外就是执行的时机也会有一些不同,假设 Vue2 和 Vue3 同一个生命周期周设置了两种形式的钩子方法,Vue3 的钩子方法的执行时机会早于 Vue2 的钩子方法。

vue
<template>
  <div>Vue2 和 Vue3 钩子函数执行时机对比</div>
</template>

<script>
import { onMounted } from "vue";
// 这里使用选项时API风格
export default {
  mounted() {
    console.log("执行Vue2的钩子函数");
  },
  setup() {
    // 使用setup函数
    onMounted(() => {
      console.log("执行Vue3的onMounted函数");
    });
  },
};
</script>

<style scoped></style>

上面的这个点稍微有一个印象即可。真实开发中是不可能两个版本的生命周期钩子方法混着使用的。


-EOF-

MIT License