您的位置:首页 > 财经 > 产业 > 【Vue3】组件生命周期

【Vue3】组件生命周期

2025/1/7 10:48:48 来源:https://blog.csdn.net/Silent_Paladin/article/details/140808585  浏览:    关键词:【Vue3】组件生命周期

【Vue3】组件生命周期

  • 背景
  • 简介
  • 开发环境
  • 开发步骤及源码

背景

随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本文内容并非完全原创,大多是参考其他文章资料整理所得,感谢每位技术人的开源精神。

简介

本文介绍 Vue 组件生命周期。

Vue 组件生命周期包含四个阶段:

  • 创建
  • 挂载
  • 更新
  • 销毁

生命周期各阶段对应以下 Hooks 函数:

阶段Vue3 Hooks 函数Vue2 Hooks 函数
创建 - 创建前setupbeforeCreate
创建 - 创建完毕setupcreated
挂载 - 挂载前onBeforeMountbeforeMount
挂载 - 挂载完毕onMountedmounted
更新 - 更新前onBeforeUpdatebeforeUpdate
更新 - 更新完毕onUpdatedupdated
销毁 - 销毁前onBeforeUnmountedbeforeDestroy
销毁 - 销毁完毕onUnmounteddestroyed

Vue3 与 Vue2 生命周期 Hooks 函数的区别:

  • Vue3 创建阶段对应 setup
  • Vue3 Hooks 函数名添加了 on 前缀;
  • Vue3 挂载(Mount)和销毁(Unmount)对应的 Hooks 函数名相互对应。

本文主要演示 Vue3 生命周期 Hooks 函数代码。

开发环境

分类名称版本
操作系统WindowsWindows 11
IDEVisual Studio Code1.91.1

开发步骤及源码

1> 创建 Vue3 工程,参考:【Vue3】工程创建及目录说明。

2> 删除 src 目录下 assetscomponents 目录。

3> 修改 src 目录下 main.ts

import { createApp } from 'vue'
import App from './App.vue'createApp(App).mount('#app')

4> 自定义功能组件 src/components/Demo.vue,在生命周期各阶段对应的 Hooks 函数中执行打印。

<template><div class="demo" @click="changeColor" :style="{ backgroundColor: color }"><h1>{{ title }}</h1></div>
</template><script setup lang="ts">
import { onBeforeMount, onBeforeUnmount, onBeforeUpdate, onMounted, onUnmounted, onUpdated, ref } from 'vue'const title = ref('自定义功能组件')
const color = ref('orange')function changeColor() {color.value = (color.value == 'orange') ? 'yellow' : 'orange'
}console.log('创建:', title.value)onBeforeMount(() => {console.log('挂载前:', title.value)
})onMounted(() => {console.log('挂载完毕:', title.value)
})onBeforeUpdate(() => {console.log('更新前:', title.value)
})onUpdated(() => {console.log('更新完毕:', title.value)
})onBeforeUnmount(() => {console.log('销毁(卸载)前:', title.value)
})onUnmounted(() => {console.log('销毁(卸载)完毕:', title.value)
})
</script>

5> 修改 Vue 根组件 src/App.vue,引用自定义功能组件,并在生命周期各阶段对应的 Hooks 函数中执行打印。

<template><div class="root"@click="changeColor":style="{ backgroundColor: color }"><h1>{{ title }}</h1><button @click="presence = !presence">隐藏/显示自定义功能组件</button><Demo v-if="presence" /></div>
</template><script setup lang="ts">
import Demo from './components/Demo.vue'
import { onBeforeMount, onBeforeUnmount, onBeforeUpdate, onMounted, onUnmounted, onUpdated, ref } from 'vue'const title = ref('App组件')
const color = ref('blue')
const presence = ref(true)function changeColor() {color.value = (color.value == 'blue') ? 'green' : 'blue'
}console.log('创建:', title.value)onBeforeMount(() => {console.log('挂载前:', title.value)
})onMounted(() => {console.log('挂载完毕:', title.value)
})onBeforeUpdate(() => {console.log('更新前:', title.value)
})onUpdated(() => {console.log('更新完毕:', title.value)
})onBeforeUnmount(() => {console.log('销毁(卸载)前:', title.value)
})onUnmounted(() => {console.log('销毁(卸载)完毕:', title.value)
})
</script><style scoped lang="scss">
.root {padding: 20px;
}
</style>

注意:需要执行 npm install -D sass 命令安装 CSS 预处理器。

6> 执行命令 npm run dev,浏览器访问 http://localhost:5173/,观察浏览器控制台中的日志打印。
启动日志
从日志中可以看出,先执行根组件 创建挂载前,在 根组件挂载过程中 执行子组件的 创建挂载,当子组件 挂载完毕 后才触发根组件 挂载完毕

7> 点击根组件 <div> 区域,注意不要点击到子组件的 <div> 区域,观察日志打印。
根组件更新日志
可见只触发了根组件 更新

8> 点击子组件的 <div> 区域,观察日志打印。
子组件更新日志
先触发子组件 更新,然后触发根组件 更新,因为默认 JS 事件冒泡。

9> 点击页面中 隐藏/显示自定义功能组件 按钮隐藏组件,观察日志打印。
隐藏组件日志
首先触发根组件 更新前,在 根组件更新过程中 触发子组件 销毁(卸载),然后触发根组件 更新完毕

10> 点击页面中 隐藏/显示自定义功能组件 按钮显示组件,观察日志打印。
显示组件日志
首先触发根组件 更新前,在 根组件更新过程中 触发子组件 创建挂载,子组件 挂载完毕 后触发根组件 更新完毕

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com