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的Date()方法使用详解
Jun 09 Javascript
javascript获取select值的方法分析
Jul 02 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
Sep 08 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
May 11 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
Jul 24 Javascript
angular2+node.js express打包部署的实战
Jul 27 Javascript
基于JavaScript中字符串的match与replace方法(详解)
Dec 04 Javascript
webpack4.x打包过程详解
Jul 18 Javascript
React SSR样式及SEO的实践
Oct 22 Javascript
jquery插件开发模式实例详解
Jul 20 jQuery
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
Dec 04 Javascript
使用refresh_token实现无感刷新页面
Apr 26 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
基于MySQL分区性能的详细介绍
2013/05/02 PHP
php原生导出excel文件的两种方法(推荐)
2016/11/19 PHP
php中通用的excel导出方法实例
2017/12/30 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
小试JQuery的AutoComplete插件
2011/05/04 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
2015/10/16 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
JavaScript Split()方法
2015/12/18 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
vue学习笔记之指令v-text &amp;&amp; v-html &amp;&amp; v-bind详解
2017/05/12 Javascript
JavaScript中常见内置函数用法示例
2018/05/14 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
JS实现进度条动态加载特效
2020/03/25 Javascript
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
Python探索之修改Python搜索路径
2017/10/25 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
python使用nibabel和sitk读取保存nii.gz文件实例
2020/07/01 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
泰国网上购物:Shopee泰国
2018/09/14 全球购物
新闻报道策划方案
2014/06/11 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书
参加招聘会后的感想
2015/08/10 职场文书
2019幼儿园感恩节活动策划书
2019/11/28 职场文书
pandas数值排序的实现实例
2021/07/25 Python
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis
Python 文字识别
2022/05/11 Python
React自定义hook的方法
2022/06/25 Javascript