Vue 生命周期钩子总结


Vue 生命周期钩子总结

Vue 组件的生命周期钩子允许在组件不同阶段执行自定义逻辑。以下是各阶段的钩子函数及其用途、触发时机和注意事项:


1. 生命周期阶段概览

Vue 组件的生命周期分为四个主要阶段:

  1. 创建(Creation):初始化数据观测、事件等。
  2. 挂载(Mounting):将组件挂载到 DOM。
  3. 更新(Updating):响应数据变化,重新渲染。
  4. 销毁(Destruction):销毁组件实例,清理资源。

2. Vue2 生命周期钩子

钩子函数及触发顺序
钩子函数触发时机用途
beforeCreate实例初始化后,数据观测/事件配置前初始化非响应式变量(如插件配置)
created实例创建完成,数据观测/事件配置完成发起异步请求、访问响应式数据
beforeMount挂载开始前(编译模板,生成虚拟 DOM)极少使用
mounted实例挂载到 DOM 后操作 DOM、初始化第三方库
beforeUpdate数据变化后,重新渲染前获取更新前的 DOM 状态
updated数据变化导致重新渲染完成操作更新后的 DOM
beforeDestroy实例销毁前清理定时器、取消事件监听
destroyed实例销毁后极少使用
代码示例
export default {
  beforeCreate() {
    console.log('beforeCreate:数据未初始化');
  },
  created() {
    console.log('created:数据已初始化,可访问 this.data');
  },
  beforeMount() {
    console.log('beforeMount:模板编译完成,未挂载到 DOM');
  },
  mounted() {
    console.log('mounted:DOM 已挂载');
  },
  beforeUpdate() {
    console.log('beforeUpdate:数据变化,DOM 更新前');
  },
  updated() {
    console.log('updated:DOM 更新完成');
  },
  beforeDestroy() {
    console.log('beforeDestroy:实例销毁前');
  },
  destroyed() {
    console.log('destroyed:实例已销毁');
  }
}

3. Vue3 生命周期钩子变化

Vue3 保留了 Vue2 的生命周期钩子,但命名略有调整,并新增了 setup 函数作为组合式 API 的入口。

主要变化
  1. 钩子函数前缀
    • Vue2 的 beforeDestroy → Vue3 的 beforeUnmount
    • Vue2 的 destroyed → Vue3 的 unmounted
  2. 组合式 API
    • setup() 中使用生命周期钩子需通过 onX 函数(如 onMounted)。
Vue3 钩子对照表
Vue2 钩子Vue3 钩子说明
beforeCreatesetup()setup() 替代
createdsetup()setup() 替代
beforeMountonBeforeMount挂载前执行
mountedonMounted挂载后执行
beforeUpdateonBeforeUpdate更新前执行
updatedonUpdated更新后执行
beforeDestroyonBeforeUnmount卸载前执行
destroyedonUnmounted卸载后执行
Vue3 组合式 API 示例
import { onMounted, onUnmounted } from 'vue';

export default {
  setup() {
    onMounted(() => {
      console.log('mounted:DOM 已挂载');
    });

    onUnmounted(() => {
      console.log('unmounted:实例已销毁');
    });
  }
}

4. 常见使用场景

钩子函数典型场景
created发起 API 请求、初始化非 DOM 相关数据
mounted操作 DOM、初始化图表库(如 ECharts)
beforeUpdate获取更新前的滚动位置
updated数据变化后调整 UI 布局
beforeUnmount清除定时器、取消全局事件监听

5. 注意事项

  1. 避免在 created/mounted 中阻塞主线程
    异步操作(如 API 请求)应使用 async/await 或 Promise,避免页面卡顿。
  2. 不要在 updated 中修改状态
    可能导致无限循环更新。
  3. Vue3 的 setup 替代了 beforeCreate/created
    所有初始化逻辑应在 setup() 中完成。
  4. SSR 中不可用的钩子
    beforeMountmountedbeforeUpdateupdated 在服务端渲染时不会执行。

6. 特殊场景钩子

activateddeactivated
  • 用途:用于 <keep-alive> 缓存的组件,监听组件的激活/停用状态。
  • 示例
    export default {
      activated() {
        console.log('组件被激活(从缓存中恢复)');
      },
      deactivated() {
        console.log('组件被停用(进入缓存)');
      }
    }
    
错误处理钩子(Vue2.5+)
  • errorCaptured:捕获子组件树中的错误,可用于全局错误上报。
    export default {
      errorCaptured(err, vm, info) {
        console.error('捕获到错误:', err);
        return false; // 阻止错误继续向上传播
      }
    }
    

总结

  • Vue2 生命周期钩子beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed
  • Vue3 主要变化:重命名销毁阶段钩子,引入组合式 API 的 onX 函数。
  • 核心原则
    • 数据初始化created(Vue2)或 setup(Vue3)。
    • DOM 操作mounted 后执行。
    • 资源清理beforeUnmount/beforeDestroy 中完成。

理解生命周期钩子的执行顺序和适用场景,有助于编写高效、可维护的 Vue 组件。

### Vue.js 生命周期钩子详解 Vue.js 提供了一套完整的生命周期钩子,使开发者可以在不同阶段执行特定逻辑。以下是主要的生命周期钩子及其用途: #### 创建期间的钩子 - **beforeCreate**: 在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用[^1]。 - **created**: 完成 data 和 methods 的初始化后立即调用,此时 el 还未挂载,无法访问 DOM 元素[^2]。 ```javascript new Vue({ beforeCreate() { console.log(&#39;beforeCreate&#39;); }, created() { console.log(&#39;created&#39;); } }); ``` #### 挂载期间的钩子 - **beforeMount**: 在挂载开始之前被调用,相关的 render 函数首次被调用[^3]。 - **mounted**: 实例已挂载到真实 DOM 中,可以在此处获取并操作 DOM 元素[^4]。 ```javascript new Vue({ template: &#39;<div id="app"></div>&#39;, mounted() { this.$nextTick(() => { const appElement = document.getElementById(&#39;app&#39;); console.log(appElement); }); } }); ``` #### 更新期间的钩子 - **beforeUpdate**: 数据更新时调用,在虚拟 DOM 打补丁之前发生[^5]。 - **updated**: 虚拟 DOM 已经完成打补丁,视图已经更新完毕[^6]。 ```javascript new Vue({ data() { return { message: &#39;Hello&#39; }; }, updated() { console.log(&#39;Component has been re-rendered!&#39;); } }); ``` #### 销毁期间的钩子 - **beforeDestroy**: 实例即将被销毁前调用,清理定时器、取消网络求等资源释放工作通常在这里处理[^7]。 - **destroyed**: 当实例被完全销毁后调用,所有的指令都被解绑,所有事件监听器都会被移除[^8]。 ```javascript new Vue({ destroyed() { clearInterval(this.timer); // 假设存在一个计时器需要清除 } }); ``` #### 条件渲染与懒加载相关钩子 对于条件渲染或懒加载组件来说,还有两个特殊的钩子: - **activated**: keep-alive 组件激活时调用[^9]。 - **deactivated**: keep-alive 组件停用时调用[^10]。 ```javascript <template> <keep-alive> <component :is="currentView"/> </keep-alive> </template> <script> export default { activated() { console.log(&#39;Activated&#39;); }, deactivated() { console.log(&#39;Deactivated&#39;); } }; </script> ``` 合理利用这些生命周期钩子可以帮助优化应用性能,提高用户体验。例如,在 `mounted` 钩子里发起 AJAX 求获取初始数据;在 `beforeDestroy` 或者 `destroyed` 钩子里清理不必要的订阅或者关闭 WebSocket 连接等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值