Vue 组件在路由跳转下的生命周期探究

深入探讨Vue-Router在开启与未开启`keepAlive`特性时,组件生命周期的变化及其背后原理。

日志准备:追踪组件生命周期事件

为了清晰地观察Vue组件在路由切换过程中的生命周期行为,我们在各个关键阶段添加日志输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
export default {
beforeCreate() {
console.log('page.beforeCreate');
},
created() {
console.log('page.created');
},
beforeMount() {
console.log('page.beforeMount');
},
mounted() {
console.log('page.mounted');
},
beforeUpdate() {
console.log('page.beforeUpdate');
},
updated() {
console.log('page.updated');
},
beforeDestroy() {
console.log('page.beforeDestroy');
},
destroyed() {
console.log('page.destroyed');
},
}

未开启keepAlive:组件的完整生命周期循环

Router 模板代码(无keepAlive

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<template>
<div class="wrapper">
<div class="container-vertical">
<main class="main">
<router-view/>
</main>
<Sidebar class="sidebar"/>
<header class="header">
<Navbar />
<Tabsbar />
</header>
</div>
</div>
</template>

日志输出与分析

1. 首次打开页面

1
2
3
4
5
6
page.beforeCreate
page.created
page.beforeMount
page.mounted
page.beforeUpdate
page.updated

首次加载页面时,组件经历了完整的生命周期过程:从创建到挂载,再到首次数据更新。这符合预期,组件初次渲染需经历这些步骤以完成界面展现。

2. 切换到其他页面

1
2
page.beforeDestroy
page.destroyed

当用户导航至另一个路由,当前组件被销毁,触发了beforeDestroydestroyed钩子。这是因为默认情况下,Vue Router在路由切换时会卸载离开路由的组件,释放其资源。

3. 页面切回

1
2
3
4
5
6
page.beforeCreate
page.created
page.beforeMount
page.mounted
page.beforeUpdate
page.updated

当用户返回原页面,组件重新经历完整的生命周期流程,如同首次加载一样。这是因为之前该组件已被销毁,所以再次访问时需要重新创建、挂载和更新。

4. 总结

在未启用keepAlive的情况下,路由切换会导致相关组件频繁地创建、销毁,这对于性能敏感或数据状态需持久化的场景可能不够理想。每次跳转都会触发完整的生命周期过程,增加了不必要的计算和DOM操作。

开启keepAlive:组件的缓存与复用

Router 模板代码(开启keepAlive

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<template>
<div class="wrapper">
<div class="container-vertical">
<main class="main">
<keep-alive>
<router-view/>
</keep-alive>
</main>
<Sidebar class="sidebar"/>
<header class="header">
<Navbar />
<Tabsbar />
</header>
</div>
</div>
</template>

日志输出与分析

1. 首次打开页面

1
2
3
4
5
6
page.beforeCreate
page.created
page.beforeMount
page.mounted
page.beforeUpdate
page.updated

首次加载页面时,组件生命周期表现与未开启keepAlive时相同,仍需经历完整的生命周期过程。

2. 切换到其他页面

1
2
3
4
5
6
```

此时控制台没有任何日志输出,表明组件并未触发销毁相关的生命周期钩子。`keepAlive`通过缓存已离开视图但用户可能快速返回的组件,避免了不必要的销毁和重建过程。

#### 3. **页面切回**

```

同样,返回原页面时,控制台无日志输出,说明组件没有重新经历创建和挂载等过程。keepAlive直接从缓存中取出已激活的组件,并将其重新插入到DOM中,实现了组件状态的无缝恢复。

4. 总结

开启keepAlive后,路由切换时相关组件不再被立即销毁,而是被缓存起来。当用户返回时,组件能从缓存中快速复用,避免了重复的生命周期过程,提高了页面切换的性能,同时保留了组件的状态。这对于保持用户交互连续性、提升应用响应速度具有显著作用。

综上所述,Vue的keepAlive特性为路由间的组件提供了高效的缓存与复用机制,显著优化了用户体验与应用性能。在实际项目中,应根据业务需求灵活运用keepAlive,特别是在包含大量复杂组件或需要保持用户交互状态的场景中。