深入理解vue-router之keep-alive
本文基于Vue2.0
keep-alive简介
keep-alive是Vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。
用法也很简单:
props
- include-字符串或正则表达,只有匹配的组件会被缓存
- exclude-字符串或正则表达式,任何匹配的组件都不会被缓存
//组件a exportdefault{ name:'a', data(){ return{} } }
可以保留它的状态或避免重新渲染
可以保留它的状态或避免重新渲染
遇见vue-router
router-view也是一个组件,如果直接被包在keep-alive里面,所有路径匹配到的视图组件都会被缓存:
然而产品汪总是要改需求,拦都拦不住...
问题
如果只想router-view里面某个组件被缓存,怎么办?
- 使用include/exclude
- 增加router.meta属性
使用include/exclude
//组件a exportdefault{ name:'a', data(){ return{} } }
exclude例子类似。
缺点:需要知道组件的name,项目复杂的时候不是很好的选择
增加router.meta属性
//routes配置 exportdefault[ { path:'/', name:'home', component:Home, meta:{ keepAlive:true//需要被缓存 } },{ path:'/:id', name:'edit', component:Edit, meta:{ keepAlive:false//不需要被缓存 } } ]
优点:不需要例举出需要被缓存组件名称
【加盐】使用router.meta拓展
假设这里有3个路由:A、B、C。
需求:
- 默认显示A
- B跳到A,A不刷新
- C跳到A,A刷新
实现方式
在A路由里面设置meta属性:
{ path:'/', name:'A', component:A, meta:{ keepAlive:true//需要被缓存 } }
在B组件里面设置beforeRouteLeave:
exportdefault{ data(){ return{}; }, methods:{}, beforeRouteLeave(to,from,next){ //设置下一个路由的meta to.meta.keepAlive=true;//让A缓存,即不刷新 next(); } };
在C组件里面设置beforeRouteLeave:
exportdefault{ data(){ return{}; }, methods:{}, beforeRouteLeave(to,from,next){ //设置下一个路由的meta to.meta.keepAlive=false;//让A不缓存,即刷新 next(); } };
这样便能实现B回到A,A不刷新;而C回到A则刷新。
总结
路由大法不错,不需要关心哪个页面跳转过来的,只要router.go(-1)就能回去,不需要额外参数。
然而在非单页应用的时候,keep-alive并不能有效的缓存了==
参考
issues#811
vue#keep-alive
vue2.0keep-alive最佳实践
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。