vue-router 实现组件的缓存之 keep-alive
2017-11-01 15:55
1176 查看
一、
用法:
props
include-字符串或正则表达式,只有匹配的组件会被缓存
exclude-字符串或正则表达式,任何匹配的组件都不会被缓存
遇见vue-router
问题
如果只想router-view里面某个组件被缓存,怎么办?
1、使用include/exclude
2、增加router.meta属性
第一种方法上面已经描述,下面说第二种方法
增加router.meta属性
《附加》使用 router.meta 拓展
假设这里有 3 个路由: A、B、C。
需求:
默认显示 A
B 跳到 A,A 不刷新
C 跳到 A,A 刷新
实现方式:
在 A 路由里面设置 meta 属性:
在 B 组件里面设置 beforeRouteLeave:
在 C 组件里面设置 beforeRouteLeave:
这样便能实现 B 回到 A,A 不刷新;而 C 回到 A 则刷新。
总结
路由大法不错,不需要关心哪个页面跳转过来的,只要 router.go(-1) 就能回去,不需要额外参数。
然而在非单页应用的时候,keep-alive 并不能有效的缓存了= =
keep-alive简介
keep-alive是Vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。
用法:
<keep-alive> <component> <!-- 该组件将被缓存! --> </component> </keep-alive>
props
include-字符串或正则表达式,只有匹配的组件会被缓存
exclude-字符串或正则表达式,任何匹配的组件都不会被缓存
//组件 a export default { name: 'a', data () { return {} } }
<keep-alive include="a"> <component> <!-- name 为 a 的组件将被缓存! --> </component> </keep-alive>可以保留它的状态或避免重新渲染
<keep-alive exclude="a"> <component> <!-- 除了 name 为 a 的组件都将被缓存! --> </component> </keep-alive>可以保留它的状态或避免重新渲染
遇见vue-router
router-view也是一个组件,如果直接被包在
keep-alive里面,所有路径匹配到的视图组件都会被缓存:
<keep-alive> <router-view> <!-- 所有路径匹配到的视图组件都会被缓存! --> </router-view> </keep-alive>
问题
如果只想router-view里面某个组件被缓存,怎么办?
1、使用include/exclude
2、增加router.meta属性
第一种方法上面已经描述,下面说第二种方法
增加router.meta属性
// routes 配置 export default [ { path: '/', name: 'home', component: Home, meta: { keepAlive: true // 需要被缓存 } }, { path: '/:id', name: 'edit', component: Edit, meta: { keepAlive: false // 不需要被缓存 } } ]
<keep-alive> <router-view v-if="$route.meta.keepAlive"> <!-- 这里是会被缓存的视图组件,比如 Home! --> </router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive"> <!-- 这里是不被缓存的视图组件,比如 Edit! --> </router-view>
《附加》使用 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:
export default { data() { return {}; }, methods: {}, beforeRouteLeave(to, from, next) { // 设置下一个路由的 meta to.meta.keepAlive = true; // 让 A 缓存,即不刷新 next(); } };
在 C 组件里面设置 beforeRouteLeave:
export default { data() { return {}; }, methods: {}, beforeRouteLeave(to, from, next) { // 设置下一个路由的 meta to.meta.keepAlive = false; // 让 A 不缓存,即刷新 next(); } };
这样便能实现 B 回到 A,A 不刷新;而 C 回到 A 则刷新。
总结
路由大法不错,不需要关心哪个页面跳转过来的,只要 router.go(-1) 就能回去,不需要额外参数。
然而在非单页应用的时候,keep-alive 并不能有效的缓存了= =
相关文章推荐
- vue 使某个组件不被 keep-alive 缓存的方法
- vue 如何使某个组件不被 keep-alive 缓存
- 内置组件 && vue中强大的缓存机制之keep-alive
- vue2.0 keep-alive实现缓存页面
- vue使用keep-alive实现数据缓存不刷新
- vue 的keep-alive缓存功能的实现
- Vue2.0 keep-alive 后组件不使用缓存
- Vue实现组件信息的缓存
- vue.js 2.x 能否设置某个组件不被keep-alive 的解决方案
- keep-alive的深入理解与使用(配合router-view缓存整个路由页面)
- Vue实现组件信息的缓存
- vue2.0 keep-alive 缓存页面数据 3ff0
- (vue.js)vue 父组件使用keep-alive和infinite-scroll导致在子组件触发父组件的infinite-scroll方法
- vue-router实现组件间的跳转(参数传递)
- 聊聊keep-alive组件的使用及其实现原理
- 使用vue的时候我们使用keep-alive会将页面缓存的解决方法
- 深入理解与使用keep-alive(配合router-view缓存整个路由页面)
- vuejs 无node单页应用方案二(babel-standalone or traceur,vue-router实现、组件按需懒加载)
- vue.js内置组件之keep-alive组件使用
- 修改vue的keep-alive实现仿easyui-页面tab切换