vue 指定组件缓存实例详解


Posted in Javascript onApril 01, 2018

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>可以保留它的状态或避免重新渲染

<keep-alive include="test-keep-alive">
 <!-- 将缓存name为test-keep-alive的组件 -->
 <component></component>
</keep-alive>

<keep-alive include="a,b">
 <!-- 将缓存name为a或者b的组件,结合动态组件使用 -->
 <component :is="view"></component>
</keep-alive>

<!-- 使用正则表达式,需使用v-bind -->
<keep-alive :include="/a|b/">
 <component :is="view"></component>
</keep-alive>

<!-- 动态判断 -->
<keep-alive :include="includedComponents">
 <router-view></router-view>
</keep-alive>

<keep-alive exclude="test-keep-alive">
 <!-- 将不缓存name为test-keep-alive的组件 -->
 <component></component>
</keep-alive>

遇见 vue-router

router-view 也是一个组件,如果直接被包在 keep-alive 里面,所有路径匹配到的视图组件都会被缓存:

<keep-alive>
 <router-view>
 <!-- 所有路径匹配到的视图组件都会被缓存! -->
 </router-view>
</keep-alive>

然而产品汪总是要改需求,拦都拦不住...

问题

如果只想 router-view 里面某个组件被缓存,怎么办?

使用 include/exclude
增加 router.meta 属性
使用 include/exclude

// 组件 a
export default {
 name: 'a',
 data () {
 return {}
 }
}
<keep-alive include="a">
 <router-view>
 <!-- 只有路径匹配到的视图 a 组件会被缓存! -->
 </router-view>
</keep-alive>

exclude 例子类似。

缺点:需要知道组件的 name,项目复杂的时候不是很好的选择

增加 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 并不能有效的缓存了= =

Javascript 相关文章推荐
jquery判断小数点两位和自动删除小数两位后的数字
Mar 19 Javascript
JavaScript对象的property属性详解
Apr 01 Javascript
js数组依据下标删除元素
Apr 14 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
Oct 22 Javascript
JS日期加减,日期运算代码
Nov 05 Javascript
jQuery简单实现仿京东分类导航层效果
Jun 07 Javascript
AngularJS中run方法的巧妙运用
Jan 04 Javascript
JS常用倒计时代码实例总结
Feb 07 Javascript
js分页之前端代码实现和请求处理
Aug 04 Javascript
JavaScript函数绑定用法实例分析
Nov 14 Javascript
node.JS事件机制与events事件模块的使用方法详解
Feb 06 Javascript
Vuejs通过拖动改变元素宽度实现自适应
Sep 02 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
Apr 01 #Javascript
vue-cli项目优化方法- 缩短首屏加载时间
Apr 01 #Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
Apr 01 #Javascript
Vue项目使用CDN优化首屏加载问题
Apr 01 #Javascript
对Angular中单向数据流的深入理解
Mar 31 #Javascript
jQuery中复合选择器简单用法示例
Mar 31 #jQuery
jQuery中内容过滤器简单用法示例
Mar 31 #jQuery
You might like
浅析php中抽象类和接口的概念以及区别
2013/06/27 PHP
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
Javascript this 的一些学习总结
2012/08/02 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
js单例模式详解实例
2013/11/21 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
js阻止默认事件与js阻止事件冒泡示例分享 js阻止冒泡事件
2014/01/27 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
Javascript函数的参数
2015/07/16 Javascript
js实现键盘自动打字效果
2016/12/23 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
vue组件中的数据传递方法
2018/05/14 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
2019/04/25 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
2019/10/23 jQuery
jquery实现穿梭框功能
2021/01/19 jQuery
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
python文件名和文件路径操作实例
2017/09/29 Python
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
Jacques Lemans德国:奥地利钟表品牌
2019/12/26 全球购物
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
夜大毕业生自我鉴定
2013/10/31 职场文书
搞笑创意广告语
2014/03/17 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
Python基础之函数嵌套知识总结
2021/05/23 Python