正则和数组形式,必须采用v-bind形式来使用。
缓存组件的使用方式: <!-- 逗号分隔字符串 --> <keep-alive include="a,b"> <component :is="view"></component> </keep-alive> <!-- 正则表达式 (使用 `v-bind`) --> <keep-alive :include="/a|b/"> <component :is="view"></component> </keep-alive> <!-- 数组 (使用 `v-bind`) --> <keep-alive :include="['a', 'b']"> <component :is="view"></component> </keep-alive>但更多场景中,我们会使用keep-alive来缓存路由:
<keep-alive include='a'> <router-view></router-view> </keep-alive> 匹配规则:首先匹配组件的name选项,如果name选项不可用。
则匹配它的局部注册名称。 (父组件 components 选项的键值)
匿名组件,不可匹配。
比如路由组件没有name选项,并且没有注册的组件名。
只能匹配当前被包裹的组件,不能匹配更下面嵌套的子组件。
比如用在路由上,只能匹配路由组件的name选项,不能匹配路由组件里面的嵌套组件的name选项。
文档:
exclude的优先级大于include
也就是说:当include和exclude同时存在时,exclude生效,include不生效。
<keep-alive include="a,b" exclude="a"> <!--只有a不被缓存--> <router-view></router-view> </keep-alive>当组件被exclude匹配,该组件将不会被缓存,不会调用activated 和 deactivated。
组件生命周期钩子:关于组件的生命周期,是时候放出这张图片了:
这张图片已经讲得很清楚了,很多人这部分也很清楚了,大部分生命周期并不会用到,这里提一下几点:
ajax请求最好放在created里面,因为此时已经可以访问this了,请求到数据就可以直接放在data里面。
这里也碰到过几次,面试官问:ajax请求应该放在哪个生命周期。
关于dom的操作要放在mounted里面,在mounted前面访问dom会是undefined。
每次进入/离开组件都要做一些事情,用什么钩子:
不缓存:
进入的时候可以用created和mounted钩子,离开的时候用beforeDestory和destroyed钩子,beforeDestory可以访问this,destroyed不可以访问this。
缓存了组件:
缓存了组件之后,再次进入组件不会触发beforeCreate、created 、beforeMount、 mounted,如果你想每次进入组件都做一些事情的话,你可以放在activated进入缓存组件的钩子中。
同理:离开缓存组件的时候,beforeDestroy和destroyed并不会触发,可以使用deactivated离开缓存组件的钩子来代替。
触发钩子的完整顺序:将路由导航、keep-alive、和组件生命周期钩子结合起来的,触发顺序,假设是从a组件离开,第一次进入b组件:
beforeRouteLeave:路由组件的组件离开路由前钩子,可取消路由离开。
beforeEach: 路由全局前置守卫,可用于登录验证、全局路由loading等。
beforeEnter: 路由独享守卫
beforeRouteEnter: 路由组件的组件进入路由前钩子。
beforeResolve:路由全局解析守卫
afterEach:路由全局后置钩子
beforeCreate:组件生命周期,不能访问this。
created:组件生命周期,可以访问this,不能访问dom。
beforeMount:组件生命周期
deactivated: 离开缓存组件a,或者触发a的beforeDestroy和destroyed组件销毁钩子。
mounted:访问/操作dom。
activated:进入缓存组件,进入a的嵌套子组件(如果有的话)。
执行beforeRouteEnter回调函数next。
结语Vue提供了很多钩子,但很多钩子我们几乎不会用到,只有清楚这些钩子函数的触发顺序以及背后的一些限制等,这样我们才能够正确的使用这些钩子,希望看了本文的同学,能对这些钩子有更加清晰的认识,使用起来更加得心应手。