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 相关文章推荐
JavaScript 组件之旅(四):测试 JavaScript 组件
Oct 28 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
Apr 26 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
Nov 08 Javascript
浅谈Unicode与JavaScript的发展史
Jan 19 Javascript
使用jQueryMobile实现滑动翻页效果的方法
Feb 04 Javascript
详解jQuery中的元素的属性和相关操作
Aug 14 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
Nov 25 Javascript
关于angularJs指令的Scope(作用域)介绍
Oct 25 Javascript
jQuery与JavaScript节点创建方法的对比
Nov 18 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
Sep 25 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
Aug 30 Javascript
JS常见内存泄漏及解决方案解析
May 30 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最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
php使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
python中requests使用代理proxies方法介绍
2017/10/25 Python
python书籍信息爬虫实例
2018/03/19 Python
pytorch 数据集图片显示方法
2018/07/26 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
python 图像平移和旋转的实例
2019/01/10 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
vscode写python时的代码错误提醒和自动格式化的方法
2020/05/07 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
博士毕业生自我鉴定范文
2014/04/13 职场文书
HR求职自荐信范文
2014/06/21 职场文书
语文教师求职信范文
2015/03/20 职场文书
小学感恩节活动总结
2015/03/24 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
2019年教师节:送给所有老师的祝福语
2019/09/05 职场文书