页面路由切换时,路由钩子函数,生命周期函数执行顺序

本文详细探讨了Vue中在没有和使用keepAlive情况下,页面路由切换时路由钩子和组件生命周期钩子的执行顺序。在没有keepAlive时,beforeDestroy和destroyed在beforeMount和mounted之间执行;而启用keepAlive时,activated始终在mounted之后,deactivated则在下个页面的beforeMount和mounted之间,并在activated之前执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

情况1, 两个页面不存在keepAlive
  • pageA 切换到 pageB 路由钩子和生命钩子函数的执行顺序
    pageA -->pageA beforeRouteLeave -->全局 beforeEach -->pageB beforeEnter -->pageB beforeRouteEnter --> 全局 beforeResolve -->全局 afterEach -->pageB beforeCreate -->pageB created -->pageB beforeMount --> pageA beforeDestroy–> pageA destroyed -->pageB mounted
    –>pageB

总结

  1. beforeDestroy,destroyed 执行都在beforeMount, mounted 之间
情况2, pageA, pageB 有keepAlive
  • pageA 切换到 pageB 路由钩子和生命钩子函数的执行顺序

pageA -->pageA beforeRouteLeave -->全局 beforeEach -->pageB beforeEnter -->pageB beforeRouteEnter --> 全局 beforeResolve -->全局 afterEach -->pageB beforeCreate -->pageB created -->pageB beforeMount -->pageA deactivated -->pageB mountedpageB activated
–>pageB

总结

  1. activated 执行始终在mounted 之后,在上个页面 deactivated 之后
  2. deactivated 执行始终下个页面在 beforeMount 和 mounted 之间,在下个页面 activated 之前
### Vue3 中 `keep-alive` 与非 `keep-alive` 切换路由触发的生命周期差异 #### 非 `keep-alive` 场景下的生命周期行为 在未使用 `<keep-alive>` 的情况下,每次切换路由都会销毁当前组件并重新创建目标组件。因此,完整的 Vue 组件生命周期会被触发,具体顺序如下: 1. 当前组件被卸载会依次调用 `beforeDestroy` 和 `destroyed` 方法。 2. 新的目标组件加载会依次调用 `beforeCreate`, `created`, `beforeMount`, 和 `mounted` 方法。 这种模式适用于不需要保存状态的场景,因为每次切换都会重新初始化组件及其内部状态[^2]。 #### 使用 `keep-alive` 场景下的生命周期行为 当使用 `<keep-alive>` 包裹路由视图Vue 会对匹配的组件进行缓存处理。此,常规的生命周期方法不会再次触发,而是引入了两个额外的生命周期钩子:`onActivated` 和 `onDeactivated`。以下是具体的生命周期触发情况: 1. **初次进入组件** - 如果是第一次访问某个被 `<keep-alive>` 缓存的组件,则仍然会按照标准流程触发 `beforeCreate`, `created`, `beforeMount`, 和 `mounted` 生命周期方法[^4]。 2. **非首次进入组件** - 对于已经被缓存的组件,在后续切换回该组件,不再重复执行上述标准生命周期方法。取而代之的是触发 `onActivated` 钩子函数,表示组件已被激活并恢复显示[^3]。 3. **离开组件** - 当从一个被 `<keep-alive>` 缓存的组件导航至其他页面,也不会立即销毁该组件实例,而是将其存储在内存中以便下次快速重用。在此过程中,仅会触发 `onDeactivated` 钩子函数,表明组件已进入休眠状态[^1]。 通过这种方式,`<keep-alive>` 提供了一种机制来减少不必要的 DOM 操作和计算开销,从而提升用户体验特别是针对那些需要维持一定上下文或交互历史的功能模块非常有用。 ```html <!-- 示例代码 --> <template> <keep-alive> <router-view></router-view> </keep-alive> </template> <script> import { onActivated, onDeactivated } from 'vue'; export default { setup() { onActivated(() => { console.log('Component re-activated'); }); onDeactivated(() => { console.log('Component deactivated and cached'); }); } }; </script> ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值