当前位置: 首页 > news >正文

vue3和vue2生命周期的区别

Vue 3 的生命周期与 Vue 2 相比有以下核心区别,主要体现在 钩子函数命名组合式 API新增功能 上。以下是详细对比和示例说明:


1. 生命周期钩子名称变化

Vue 3 对部分生命周期钩子进行了重命名,以保持命名一致性(添加 on 前缀),并适配组合式 API:

Vue 2Vue 3说明
beforeCreate无(由 setup 替代)setup 函数已包含其逻辑
created无(由 setup 替代)setup 函数已包含其逻辑
beforeMountonBeforeMount组件挂载前触发
mountedonMounted组件挂载后触发
beforeUpdateonBeforeUpdate数据更新前触发
updatedonUpdated数据更新后触发
beforeDestroyonBeforeUnmount组件卸载前触发
destroyedonUnmounted组件卸载后触发
activatedonActivated<keep-alive> 缓存组件激活时触发
deactivatedonDeactivated<keep-alive> 缓存组件停用时触发
errorCapturedonErrorCaptured捕获子组件错误时触发

2. 组合式 API 的引入

Vue 3 引入了 组合式 API(Composition API),通过 setup() 函数替代 Vue 2 的 beforeCreatecreated 钩子。组合式 API 提供了更灵活的代码组织方式,尤其适合逻辑复用。

Vue 2 示例(选项式 API)
export default {data() {return { count: 0 };},created() {console.log('created');},mounted() {console.log('mounted');}
};
Vue 3 示例(组合式 API)
import { ref, onMounted } from 'vue';export default {setup() {const count = ref(0);console.log('setup'); // 替代 Vue 2 的 created/beforeCreateonMounted(() => {console.log('mounted');});return { count };}
};

3. 新增调试钩子

Vue 3 新增了两个调试钩子,用于追踪响应式依赖和渲染触发:

  • onRenderTracked:当渲染函数追踪到响应式依赖时触发。
  • onRenderTriggered:当响应式依赖触发重新渲染时触发。
示例
import { onRenderTracked, onRenderTriggered } from 'vue';export default {setup() {onRenderTracked((event) => {console.log('追踪依赖:', event.key); // 打印被追踪的响应式属性});onRenderTriggered((event) => {console.log('触发更新:', event.key); // 打印触发更新的响应式属性});}
};

4. 执行顺序变化(父子组件)

在父子组件的生命周期执行顺序上,Vue 3 与 Vue 2 有差异:

Vue 2 的执行顺序
父 created → 子 created → 子 mounted → 父 mounted
Vue 3 的执行顺序
父 setup → 子 setup → 父 onBeforeMount → 子 onBeforeMount → 子 onMounted → 父 onMounted

5. 异步更新机制优化

Vue 3 的更新阶段采用 异步渲染 机制,优化了性能并减少不必要的重复计算。例如,多次修改响应式数据后,Vue 3 会合并更新,避免频繁触发 DOM 操作。

示例
import { ref, onUpdated } from 'vue';export default {setup() {const count = ref(0);onUpdated(() => {console.log('DOM 更新后触发一次');});// 多次修改 count,只会触发一次 onUpdatedcount.value++;count.value++;}
};

6. 清理副作用(Cleanup)

在 Vue 3 中,onBeforeUnmount 是清理资源(如定时器、事件监听器)的推荐位置。

Vue 2 示例
export default {mounted() {this.timer = setInterval(() => {console.log('定时器运行');}, 1000);},beforeDestroy() {clearInterval(this.timer); // 清理定时器}
};
Vue 3 示例
import { onMounted, onBeforeUnmount } from 'vue';export default {setup() {let timer = null;onMounted(() => {timer = setInterval(() => {console.log('定时器运行');}, 1000);});onBeforeUnmount(() => {clearInterval(timer); // 清理定时器});}
};

7. 完整对比示例

Vue 2 生命周期钩子
export default {data() {return { message: 'Hello Vue 2' };},created() {console.log('created');},mounted() {console.log('mounted');},beforeDestroy() {console.log('beforeDestroy');}
};
Vue 3 生命周期钩子
import { ref, onMounted, onBeforeUnmount } from 'vue';export default {setup() {const message = ref('Hello Vue 3');console.log('setup'); // 替代 created/beforeCreateonMounted(() => {console.log('mounted');});onBeforeUnmount(() => {console.log('onBeforeUnmount'); // 替代 beforeDestroy});return { message };}
};

总结

特性Vue 2Vue 3
钩子名称原始命名(如 beforeCreate添加 on 前缀(如 onBeforeMount
组合式 API不支持支持,通过 setup() 函数组织逻辑
调试钩子新增 onRenderTracked/onRenderTriggered
执行顺序父组件先执行 created父组件先执行 setup
清理资源beforeDestroyonBeforeUnmount
异步更新优化同步更新异步合并更新

最佳实践建议

  1. 优先使用组合式 API:在 Vue 3 中,组合式 API 更适合复杂逻辑的组织和复用。
  2. 清理资源:始终在 onBeforeUnmount 中移除事件监听器或清除定时器。
  3. 避免在 onUpdated 中修改数据:防止无限更新循环。
  4. 利用调试钩子:通过 onRenderTracked 和 onRenderTriggered 优化性能瓶颈。

通过以上对比,可以更清晰地理解 Vue 3 的生命周期设计与 Vue 2 的差异,并在实际开发中灵活应用。


文章转载自:

http://7f0TX6sq.nmkfy.cn
http://rCFNMdeB.nmkfy.cn
http://d8lqnKV1.nmkfy.cn
http://x5oMlnqe.nmkfy.cn
http://cSppRXkh.nmkfy.cn
http://2uiw42Kz.nmkfy.cn
http://h8ICAdpa.nmkfy.cn
http://HPcfyLuj.nmkfy.cn
http://lbI1woMZ.nmkfy.cn
http://djqchHYW.nmkfy.cn
http://Sxvg1wTd.nmkfy.cn
http://8DqJFWJe.nmkfy.cn
http://Z3ejAUcr.nmkfy.cn
http://VhLDyic5.nmkfy.cn
http://u0QzcnVo.nmkfy.cn
http://IU3N0Pv1.nmkfy.cn
http://fXuzcyzr.nmkfy.cn
http://eJ6yLfLf.nmkfy.cn
http://brXj472U.nmkfy.cn
http://k5PratAA.nmkfy.cn
http://sOW7MZEg.nmkfy.cn
http://NgTxWHxs.nmkfy.cn
http://OZkikOoL.nmkfy.cn
http://hmz3mKOl.nmkfy.cn
http://ssuFQJh9.nmkfy.cn
http://1BIj9A7D.nmkfy.cn
http://Z9GrRZEX.nmkfy.cn
http://Vj7APtbr.nmkfy.cn
http://9dOr2lYb.nmkfy.cn
http://EokY1HNp.nmkfy.cn
http://www.dtcms.com/a/375589.html

相关文章:

  • 《棒球小白》棒球球落地了才能跑垒吗·棒球1号位
  • 排序算法(Java)
  • Oracle数据库
  • 腾讯开源智能体框架Youtu-agent全解析:特性、架构与实战指南
  • 【2511系统分析师备考-快速阅读一】
  • Vue 学习随笔系列二十五 -- 多文件上传并支持修改
  • 从0到1学习Vue框架Day03
  • 【Redis五种数据类型】
  • Redis 双向同步如何避免循环?【附实操演示】
  • Redis单线程模型为什么快?
  • At least one <template> or <script> is required in a single file component
  • 不止是DELETE:MySQL多表关联删除的JOIN语法实战详解
  • 动态控制rabbitmq中的消费者监听的启动和停止
  • C# 基于halcon的视觉工作流-章30-圆圆距离测量
  • Android Studio 构建项目时 Gradle 下载失败的解决方案
  • 【STM32项目开源】STM32单片机智能恒温箱控制系统
  • 苹果ios的系统app应用WebClip免签应用开源及方式原理
  • Java数据库连接JDBC完全解析
  • Node-RED 究竟是否适合工业场景?
  • zephyr开发环境搭建
  • OpenCV 实战:基于模板匹配的身份证号自动识别系统
  • java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
  • CMake工程指南
  • 单北斗GNSS该如何在变形监测中发挥最大效能?
  • 大数据毕业设计-基于大数据的高考志愿填报推荐系统(高分计算机毕业设计选题·定制开发·真正大数据)
  • 分布式锁redis
  • Java学习之——“IO流“的进阶流之转换流的学习
  • git 如何直接拉去远程仓库的内容且忽略本地与远端不一致的commit
  • 每日一算:分发糖果
  • 神经算子学习