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 相关文章推荐
js停止输出代码
Jul 20 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
Apr 23 Javascript
jQuery内置的AJAX功能和JSON的使用实例
Jul 27 Javascript
jQuery中table数据的值拷贝和拆分
Mar 19 Javascript
React中使用collections时key的重要性详解
Aug 07 Javascript
d3.js实现自定义多y轴折线图的示例代码
May 30 Javascript
JavaScript中click和onclick本质区别与用法分析
Jun 07 Javascript
WebSocket的简单介绍及应用
May 23 Javascript
VUE项目初建和常见问题总结
Sep 12 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
Nov 12 Javascript
vue cli4下环境变量和模式示例详解
Apr 09 Javascript
JavaScript实现音乐播放器
Aug 14 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/20 PHP
php实现俄罗斯乘法实例
2015/03/07 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
Angular2 多级注入器详解及实例
2016/10/30 Javascript
JS实现页面打印功能
2017/03/16 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
vue自定义指令实现方法详解
2019/02/11 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
Python 获取项目根路径的代码
2019/09/27 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
python 绘制国旗的示例
2020/09/27 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
String和StringBuffer的区别
2015/08/13 面试题
食品营养与检测应届生求职信
2013/11/08 职场文书
护校行动方案
2014/05/31 职场文书
工地安全生产标语
2014/06/06 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
复试通知单模板
2015/04/24 职场文书
大学运动会通讯稿
2015/07/18 职场文书
孙振耀退休感言
2015/08/01 职场文书
业务员管理制度范本
2015/08/06 职场文书
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL