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 相关文章推荐
在html页面中包含共享页面的方法
Oct 24 Javascript
jQuery使用height()获取高度需要注意的地方
Dec 13 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
Mar 04 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
Jan 23 Javascript
jQuery实现背景弹性滚动的导航效果
Jun 01 Javascript
聊一聊jQuery插件uploadify使用方法
Aug 24 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
Nov 28 Javascript
常用的9个JavaScript图表库详解
Dec 19 Javascript
Nuxt.js开启SSR渲染的教程详解
Nov 30 Javascript
js中Generator函数的深入讲解
Apr 07 Javascript
使用jQuery如何写一个含验证码的登录界面
May 13 jQuery
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
Sep 11 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对象类型判断
2008/08/27 PHP
Javascript - HTML的request类
2006/07/15 Javascript
javascript 播放器 控制
2007/01/22 Javascript
jquery 学习之二 属性(类)
2010/11/25 Javascript
javascript 弹出层组件(升级版)
2011/05/12 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
js获取UserControl内容为拼html时提供方便
2014/11/02 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
bootstrap中添加额外的图标实例代码
2017/02/15 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
vue-cli常用设置总结
2018/02/24 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
浅谈python字符串方法的简单使用
2016/07/18 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
keras 权重保存和权重载入方式
2020/05/21 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
numpy实现RNN原理实现
2021/03/02 Python
HTML5 拖拽批量上传文件的示例代码
2018/03/28 HTML / CSS
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
大学生应聘推荐信范文
2013/11/19 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android