是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM。
包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和相似,是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。
prop:
include: 字符串或正则表达式。只有匹配的组件会被缓存。
exclude: 字符串或正则表达式。任何匹配的组件都不会被缓存。
在2.1.0版本Vue中
常见用法:
// 组件exportdefault{name:'test-keep-alive',data(){return{includedComponents:"test-keep-alive"}}}
结合router,缓存部分页面
使用$route.meta的keepAlive属性:
需要在router中设置router的元信息meta:
//...router.jsexportdefaultnewRouter({routes:[{path:'/',name:'Hello',component:Hello,meta:{keepAlive:false// 不需要缓存}},{path:'/page1',name:'Page1',component:Page1,meta:{keepAlive:true// 需要被缓存}}]})
使用效果
以上面router的代码为例:
Vue
{{msg}}
{{msg}}
(1) 在Page1页面输入框输入“asd”,然后手动跳转到Hello页面;
(2) 回到Page1页面发现之前输入的"asd"依然保留,说明页面信息成功保存在内存中;
图1 进入Page1页面,并输入"asd"
图2 跳转到Hello
图3 返回Page1页面,输入框数据会被保留
当然,也可以通过动态设置route.meta的keepAlive属性来实现其他需求,
借鉴一下vue-router 之 keep-alive,作者:caroly这篇博客中的例子:
首页是A页面
B页面跳转到A,A页面需要缓存
C页面跳转到A,A页面不需要被缓存
思路是在每个路由的beforeRouteLeave(to, from, next)钩子中设置to.meta.keepAlive:
A的路由:
{path:'/',name:'A',component:A,meta:{keepAlive:true// 需要被缓存}}
exportdefault{ data() {return{}; }, methods: {}, beforeRouteLeave(to,from, next) {// 设置下一个路由的 metato.meta.keepAlive =true;// B 跳转到 A 时,让 A 缓存,即不刷新next(); }};
exportdefault{ data() {return{}; }, methods: {}, beforeRouteLeave(to,from, next) {// 设置下一个路由的 metato.meta.keepAlive =false;// C 跳转到 A 时让 A 不缓存,即刷新next(); }};