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 相关文章推荐
简单三步,搞掂内存泄漏
Mar 10 Javascript
Javascript延迟执行实现方法(setTimeout)
Dec 30 Javascript
jQuery Jcrop插件实现图片选取功能
Nov 23 Javascript
鼠标划过实现延迟加载并隐藏层的js代码
Oct 11 Javascript
使用Js让Html中特殊字符不被转义
Nov 05 Javascript
微信小程序 devtool隐藏的秘密
Jan 21 Javascript
JavaScript的继承实现小结
May 07 Javascript
详解Vue用axios发送post请求自动set cookie
May 10 Javascript
原生JS实现自定义滚动条效果
Oct 27 Javascript
laravel5.4+vue+element简单搭建的示例代码
Aug 29 Javascript
微信小程序实现自定义modal弹窗封装的方法
Jun 15 Javascript
vue实现表格合并功能
Dec 01 Vue.js
通过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数据库操作面向对象的优点
2006/10/09 PHP
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
php桌面中心(三) 修改数据库
2007/03/11 PHP
PHP 过滤页面中的BOM(实现代码)
2013/06/29 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
jQuery find和children方法使用
2011/01/31 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
详解JavaScript操作HTML DOM的基本方式
2015/10/21 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
2017/07/11 Javascript
JavaScript编程设计模式之构造器模式实例分析
2017/10/25 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
angularJS实现动态添加,删除div方法
2018/02/27 Javascript
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python外星人入侵游戏编程完整版
2020/03/30 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
django 取消csrf限制的实例
2020/03/13 Python
CSS3的first-child选择器实战攻略
2016/04/28 HTML / CSS
德国孕妇装和婴童服装网上商店:bellybutton
2018/04/12 全球购物
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
夜大毕业生自我评价分享
2013/11/10 职场文书
个人自荐材料
2014/05/23 职场文书
政府采购方案
2014/06/12 职场文书
镇创先争优活动总结
2014/08/28 职场文书
python自动化测试通过日志3分钟定位bug
2021/11/20 Python
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL