SSF0SSF0
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
  • HTML

    • html1
    • html2
  • CSS

    • Flex 布局常见问题与解决方案
  • JavaScript

    • 数据类型及引用问题
    • 处理 Blob 类型文件下载问题总结
    • localStorage 与 sessionStorage 区别
    • JavaScript 中的 script 标签问题详解
    • JavaScript 中的`this`指向问题详解
    • SessionStorage踩坑记录:它真的能"只设置一次"吗?
    • 动态加载 JS 脚本方法对比
    • 浏览器页面关闭场景下的数据上报
  • es6

    • Promise
    • es6 模块导出方式全解析
  • Vue2

    • created VS mounted 发起异步请求
    • vue2-2
  • Vue3

    • Vite + Vue3 修改 element-plus 源码
    • Vue v-if 与 v-show
    • Vue3 ref 获取组件
    • Vue3 路由传参
    • 父子组件与组件里 Hooks 加载顺序
    • 第三方组件传入参数TS提示
    • Vue3 Props 在 Hooks 中的响应性处理
    • Vue Router 的两种历史模式及部署配置详解
    • 在Vue 3项目中顺利集成Tailwind CSS的完整指南
    • Vue 3 深度选择器:deep()完全指南
  • Electron

    • 快速构建 electron + vue3 项目
  • TS

    • TS 泛型
    • 记录模板使用断言的问题
    • type 与 interface
  • WebPack

    • Webpack 介绍
  • Vite

    • Vite CLI 常见命令
    • vite 与 webpack 比较
  • 项目工程

    • 前端代码风格
    • Vue3 项目规范
    • npm 镜像问题
    • 包管理工具
    • 使用 engines 限制开发环境依赖
    • 打包与shell交互指定模式
    • 使用 pnpm 构建 Monorepo 实战指南
    • pnpm 修改依赖源码打包报错
  • 记录一下小程序
  • 控制浏览器正确保存网站账号密码的技巧

父子组件与组件里 Hooks 加载顺序

Vue3 父子组件加载顺序

在 Vue3 中,父子组件的生命周期执行顺序如下:

  1. 挂载阶段 (Mounting):

    • 父组件 setup()
    • 父组件 onBeforeMount
    • 子组件 setup()
    • 子组件 onBeforeMount
    • 子组件 onMounted
    • 父组件 onMounted
  2. 更新阶段 (Updating):

    • 父组件 onBeforeUpdate
    • 子组件 onBeforeUpdate
    • 子组件 onUpdated
    • 父组件 onUpdated
  3. 卸载阶段 (Unmounting):

    • 父组件 onBeforeUnmount
    • 子组件 onBeforeUnmount
    • 子组件 onUnmounted
    • 父组件 onUnmounted

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <h2>父组件</h2>
    <ChildComponent />
  </div>
</template>

<script setup>
import {
  onMounted,
  onBeforeMount,
  onBeforeUpdate,
  onUpdated,
  onBeforeUnmount,
  onUnmounted,
} from "vue";
import ChildComponent from "./ChildComponent.vue";

console.log("父组件 setup");

onBeforeMount(() => {
  console.log("父组件 onBeforeMount");
});

onMounted(() => {
  console.log("父组件 onMounted");
});

onBeforeUpdate(() => {
  console.log("父组件 onBeforeUpdate");
});

onUpdated(() => {
  console.log("父组件 onUpdated");
});

onBeforeUnmount(() => {
  console.log("父组件 onBeforeUnmount");
});

onUnmounted(() => {
  console.log("父组件 onUnmounted");
});
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <h3>子组件</h3>
  </div>
</template>

<script setup>
import {
  onMounted,
  onBeforeMount,
  onBeforeUpdate,
  onUpdated,
  onBeforeUnmount,
  onUnmounted,
} from "vue";

console.log("子组件 setup");

onBeforeMount(() => {
  console.log("子组件 onBeforeMount");
});

onMounted(() => {
  console.log("子组件 onMounted");
});

onBeforeUpdate(() => {
  console.log("子组件 onBeforeUpdate");
});

onUpdated(() => {
  console.log("子组件 onUpdated");
});

onBeforeUnmount(() => {
  console.log("子组件 onBeforeUnmount");
});

onUnmounted(() => {
  console.log("子组件 onUnmounted");
});
</script>

控制台输出顺序(挂载阶段):

父组件 setup
父组件 onBeforeMount
子组件 setup
子组件 onBeforeMount
子组件 onMounted
父组件 onMounted

Composition API 中的 Hooks 执行顺序

在 Vue3 的组件中,Composition API 的执行顺序如下:

  1. setup() 函数最先执行
  2. ref/reactive 声明的响应式数据初始化
  3. watch/watchEffect 监听器建立
  4. 生命周期钩子按照上述顺序执行

示例:

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

console.log("1. setup 开始执行");

const count = ref(0);
console.log("2. ref 初始化");

const state = reactive({
  message: "Hello",
});
console.log("3. reactive 初始化");

watch(count, (newVal, oldVal) => {
  console.log("count 发生变化", newVal, oldVal);
});
console.log("4. watch 设置完成");

watchEffect(() => {
  console.log("5. watchEffect 首次执行", count.value);
});

onMounted(() => {
  console.log("6. onMounted 执行");
  count.value++; // 这将触发 watch 和 watchEffect
});
</script>

这个示例展示了在一个组件中各种 Composition API 特性的执行顺序,包括响应式数据的初始化、监听器的建立以及生命周期钩子的触发顺序。

Hooks 的执行时机

Hooks 是在组件的setup()函数中执行的,而setup()函数是最早执行的。具体顺序是:

  1. 组件实例创建前,执行setup()函数

  2. 在setup()函数内部,hooks 的执行顺序是:

    • 首先执行所有的import导入的 hooks

    • 然后按照代码书写顺序从上到下执行自定义 hooks

    • 最后执行生命周期相关的 hooks(如onMounted等)

示例:

<script setup>
import { useUserInfo } from "@/hooks/useUserInfo"; // 第1步:导入的hooks
import { useRouter } from "vue-router";

console.log("setup开始");

const userInfo = useUserInfo(); // 第2步:执行导入的hooks
const router = useRouter();

const useCustomHook = () => {
  // 第3步:执行自定义hooks
  console.log("自定义hook执行");
  return {};
};
const customData = useCustomHook();

onMounted(() => {
  // 第4步:生命周期hooks
  console.log("onMounted执行");
});
</script>

父子组件中 Hooks 的执行顺序

当涉及父子组件时,hooks 的执行遵循组件的生命周期顺序:

  1. 父组件 setup() 中的 hooks
  2. 父组件 onBeforeMount 中的 hooks
  3. 子组件 setup() 中的 hooks
  4. 子组件 onBeforeMount 中的 hooks
  5. 子组件 onMounted 中的 hooks
  6. 父组件 onMounted 中的 hooks

需要注意的是:

  • 在同一个生命周期内的 hooks,会按照代码书写顺序执行
  • 异步的 hooks(如包含await的 hooks)可能会影响实际的执行顺序
  • 应该避免在 hooks 之间产生复杂的依赖关系,保持 hooks 的独立性
最后更新时间:
贡献者: 何风顺
上一页
Vue3 路由传参
下一页
第三方组件传入参数TS提示