vue3和vue2生命周期的区别

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


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

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

Vue 2 Vue 3 说明
beforeCreate 无(由 setup 替代) setup 函数已包含其逻辑
created 无(由 setup 替代) setup 函数已包含其逻辑
beforeMount onBeforeMount 组件挂载前触发
mounted onMounted 组件挂载后触发
beforeUpdate onBeforeUpdate 数据更新前触发
updated onUpdated 数据更新后触发
beforeDestroy onBeforeUnmount 组件卸载前触发
destroyed onUnmounted 组件卸载后触发
activated onActivated <keep-alive> 缓存组件激活时触发
deactivated onDeactivated <keep-alive> 缓存组件停用时触发
errorCaptured onErrorCaptured 捕获子组件错误时触发

2. 组合式 API 的引入

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

Vue 2 示例(选项式 API)
javascript 复制代码
export default {
  data() {
    return { count: 0 };
  },
  created() {
    console.log('created');
  },
  mounted() {
    console.log('mounted');
  }
};
Vue 3 示例(组合式 API)
javascript 复制代码
import { ref, onMounted } from 'vue';

export default {
  setup() {
    const count = ref(0);
    console.log('setup'); // 替代 Vue 2 的 created/beforeCreate

    onMounted(() => {
      console.log('mounted');
    });

    return { count };
  }
};

3. 新增调试钩子

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

  • onRenderTracked:当渲染函数追踪到响应式依赖时触发。
  • onRenderTriggered:当响应式依赖触发重新渲染时触发。
示例
javascript 复制代码
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 的执行顺序
javascript 复制代码
父 created → 子 created → 子 mounted → 父 mounted
Vue 3 的执行顺序
复制代码
父 setup → 子 setup → 父 onBeforeMount → 子 onBeforeMount → 子 onMounted → 父 onMounted

5. 异步更新机制优化

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

示例
javascript 复制代码
import { ref, onUpdated } from 'vue';

export default {
  setup() {
    const count = ref(0);

    onUpdated(() => {
      console.log('DOM 更新后触发一次');
    });

    // 多次修改 count,只会触发一次 onUpdated
    count.value++;
    count.value++;
  }
};

6. 清理副作用(Cleanup)

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

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

export default {
  setup() {
    let timer = null;

    onMounted(() => {
      timer = setInterval(() => {
        console.log('定时器运行');
      }, 1000);
    });

    onBeforeUnmount(() => {
      clearInterval(timer); // 清理定时器
    });
  }
};

7. 完整对比示例

Vue 2 生命周期钩子
javascript 复制代码
export default {
  data() {
    return { message: 'Hello Vue 2' };
  },
  created() {
    console.log('created');
  },
  mounted() {
    console.log('mounted');
  },
  beforeDestroy() {
    console.log('beforeDestroy');
  }
};
Vue 3 生命周期钩子
javascript 复制代码
import { ref, onMounted, onBeforeUnmount } from 'vue';

export default {
  setup() {
    const message = ref('Hello Vue 3');

    console.log('setup'); // 替代 created/beforeCreate

    onMounted(() => {
      console.log('mounted');
    });

    onBeforeUnmount(() => {
      console.log('onBeforeUnmount'); // 替代 beforeDestroy
    });

    return { message };
  }
};

总结

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

最佳实践建议

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

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

相关推荐
chenyunjie1 分钟前
我做了一个编辑国际化i18n json文件的命令行工具
前端
Emma歌小白5 分钟前
移除视觉对象里“行的型号”造成的行级筛选,但不移除用户的 slicer 筛选
前端
玉宇夕落5 分钟前
深入理解 JavaScript 中的 this:从设计缺陷到最佳实践(完整复习版)
javascript
茶杯6756 分钟前
“舒欣双免“方案助力MSI-H/dMMR结肠癌治疗新突破
java·服务器·前端
昔人'6 分钟前
css `svh` 单位
前端·css
刻刻帝的海角7 分钟前
基于UniApp与Vue3语法糖的跨平台待办事项应用开发实践
javascript·vue.js·uni-app
转转技术团队8 分钟前
浏览器自动化革命:从 Selenium 到 AI Browser 的 20 年进化史
前端
uhakadotcom9 分钟前
全面解析:GeoJSON 与 TopoJSON 的定义、差异及适用场景
前端·面试·github
GALA10 分钟前
用 DeepSeek 给 Git 提交做自动 Code Review:从 0 落地一个本地 AI 审查流程
前端
ByteCraze11 分钟前
系统性整理组件传参14种方式
前端·javascript·vue.js