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检测函数
May 31 Javascript
return false,对阻止事件默认动作的一些测试代码
Nov 17 Javascript
使用Javascript简单实现图片无缝滚动
Dec 05 Javascript
jQuery中prevAll()方法用法实例
Jan 08 Javascript
AspNet中使用JQuery boxy插件的确认框
May 20 Javascript
JQuery鼠标移到小图显示大图效果的方法
Jun 10 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
Jul 14 Javascript
js验证真实姓名与身份证号,手机号的简单实例
Jul 18 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
Nov 17 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
Mar 09 Javascript
使用异步controller与jQuery实现卷帘式分页
Jun 18 jQuery
Element el-button 按钮组件的使用详解
Feb 01 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
2013/04/25 PHP
PHP stripos()函数及注意事项的分析
2013/06/08 PHP
php中动态变量用法实例
2015/06/10 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
golang与PHP输出excel示例
2016/07/22 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
javascript 原型继承介绍
2011/08/30 Javascript
jsp网页搜索结果中实现选中一行使其高亮
2014/02/17 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
2017/02/15 Javascript
vue调用语音播放的方法
2019/09/27 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
理解python多线程(python多线程简明教程)
2014/06/09 Python
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
Python的re模块正则表达式操作
2016/05/25 Python
Python爬虫文件下载图文教程
2018/12/23 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
django实现将后台model对象转换成json对象并传递给前端jquery
2020/03/16 Python
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
详解h5页面在不同ios设备上的问题总结
2019/03/01 HTML / CSS
介绍一下gcc特性
2015/10/31 面试题
三查三看党性分析材料
2014/02/18 职场文书
出纳员的岗位职责
2014/02/22 职场文书
《少年王勃》教学反思
2014/04/27 职场文书
调查研究项目计划书
2014/04/29 职场文书
公司投资建议书
2014/05/16 职场文书
档案接收函格式
2015/01/30 职场文书
收费员岗位职责
2015/02/14 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
Python Pygame实战在打砖块游戏的实现
2022/03/17 Python
Hive日期格式转换方法总结
2022/06/25 数据库
python 镜像环境搭建总结
2022/09/23 Python