深入理解Vue 的钩子函数(2)

文档中提到因为router.afterEach不接受 next 函数所以也不会改变导航本身,意思就是只能当成一个钩子来使用,但是我自己在试的时候发现,我们可以通过这种形式来实现跳转:

// main.js 入口文件 import router from './router' ; // 引入路由 router . afterEach (( to , from ) => { if ( 未登录 && to . name !== 'login' ) { router . push ({ name : 'login' }); // 跳转login } });

额,通过router.beforeEach 也完全可以实现且更好,我就骚一下。

完整的路由导航解析流程(不包括其他生命周期):

触发进入其他路由。

调用要离开路由的组件守卫 beforeRouteLeave

调用局前置守卫: beforeEach

在重用的组件里调用 beforeRouteUpdate

调用路由独享守卫 beforeEnter 。

解析异步路由组件。

在将要进入的路由组件中调用 beforeRouteEnter

调用全局解析守卫 beforeResolve

导航被确认。

调用全局后置钩子的 afterEach 钩子。

触发DOM更新( mounted )。

执行 beforeRouteEnter 守卫中传给 next 的回调函数

你不知道的keep-alive[我猜你不知道]

在开发Vue项目的时候,大部分组件是没必要多次渲染的,所以Vue提供了一个内置组件 keep-alive 来 缓存组件内部状态,避免重新渲染 。

文档:和 <transition> 相似, <keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。

用法:

缓存动态组件:

<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们,此种方式并无太大的实用意义。

<!-- 基本 --> < keep - alive > < component : is = "view" ></ component > </ keep - alive > <!-- 多个条件判断的子组件 --> < keep - alive > < comp - a v - if = "a > 1" ></ comp - a > < comp - b v - else ></ comp - b > </ keep - alive >

缓存路由组件:

使用 keep-alive 可以将所有路径匹配到的路由组件都缓存起来,包括路由组件里面的组件, keep-alive 大多数使用场景就是这种。

<keep-alive> < router - view ></ router - view > </ keep - alive >

生命周期钩子:

这篇既然是Vue钩子函数的专场,那肯定要扣题呀~

在被 keep-alive 包含的组件/路由中,会多出两个生命周期的钩子: activated 与 deactivated 。

文档:在 2.2.0 及其更高版本中,activated 和 deactivated 将会在 树内的 所有嵌套组件 中触发。

activated 在组件第一次渲染时会被调用,之后在每次缓存组件被激活时调用。

activated调用时机:

第一次进入缓存路由/组件,在 mounted 后面, beforeRouteEnter 守卫传给 next 的回调函数之前调用:

beforeMount=> 如果你是从别的路由/组件进来(组件销毁destroyed/或离开缓存deactivated)=>
mounted=> activated 进入缓存组件 => 执行 beforeRouteEnter回调

因为组件被缓存了,再次进入缓存路由/组件时,不会触发这些钩子:

beforeCreate created beforeMount mounted 都不会触发。

所以之后的调用时机是:

组件销毁destroyed/或离开缓存deactivated => activated 进入当前缓存组件

=> 执行 beforeRouteEnter回调

组件缓存或销毁,嵌套组件的销毁和缓存也在这里触发

deactivated:组件被停用(离开路由)时调用

使用了keep-alive就不会调用beforeDestroy(组件销毁前钩子)和destroyed(组件销毁),因为组件没被销毁,被缓存起来了。

这个钩子可以看作 beforeDestroy 的替代,如果你缓存了组件,要在组件销毁的的时候做一些事情,你可以放在这个钩子里。

如果你离开了路由,会依次触发:

组件内的离开当前路由钩子beforeRouteLeave =>  路由前置守卫 beforeEach =>

全局后置钩子afterEach => deactivated 离开缓存组件 => activated 进入缓存组件(如果你进入的也等于是缓存路由)

如果离开的组件没有缓存的话 beforeDestroy会替换deactivated

如果进入的路由也没有缓存的话  全局后置钩子afterEach=>销毁 destroyed=> beforeCreate等

那么,如果我只是想缓存其中几个路由/组件,那该怎么做?

缓存你想缓存的路由:

Vue2.1.0之前:

想实现类似的操作,你可以:

配置一下路由元信息

创建两个 keep-alive 标签

使用 v-if 通过路由元信息判断缓存哪些路由。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/4a11ae274cd315f626018742c4f5ac91.html