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 相关文章推荐
新浪中用来显示flash的函数
Apr 02 Javascript
javascript日期转换 时间戳转日期格式
Nov 05 Javascript
3种Jquery限制文本框只能输入数字字母的方法
Dec 03 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
Apr 12 Javascript
Bootstrap每天必学之进度条
Nov 30 Javascript
sso跨域写cookie的一段js脚本(推荐)
May 25 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
Jan 05 Javascript
前端主流框架vue学习笔记第一篇
Jul 26 Javascript
解决vue-cli创建项目的loader问题
Mar 13 Javascript
详解使用jest对vue项目进行单元测试
Sep 07 Javascript
elementUI同一页面展示多个Dialog的实现
Nov 19 Javascript
Vue实现指令式动态追加小球动画组件的步骤
Dec 18 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 MVC模式在网站架构中的实现分析
2010/03/04 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
重定向实现代码
2006/11/20 Javascript
JavaScript 格式字符串的应用
2010/03/29 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
jquery Ajax 实现加载数据前动画效果的示例代码
2014/02/07 Javascript
js onmousewheel事件多次触发问题解决方法
2014/10/17 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
2015/01/02 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
2015/08/22 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
自制简易打赏功能的实例
2017/09/02 Javascript
Vue使用NProgress的操作过程解析
2019/10/10 Javascript
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
Python 命令行非阻塞输入的小例子
2013/09/27 Python
使用python编写android截屏脚本双击运行即可
2014/07/21 Python
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
Python调用C语言开发的共享库方法实例
2015/03/18 Python
Python中的多重装饰器
2015/04/11 Python
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
2018/05/29 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
Python描述符descriptor使用原理解析
2020/03/21 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
2020/04/29 Python
德国网上花店:Valentins
2018/08/15 全球购物
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
德国拖鞋网站:German Slippers
2019/11/08 全球购物
相亲大会策划方案
2014/06/05 职场文书
2014年团委工作总结
2014/11/13 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
基于Python实现股票收益率分析
2022/04/02 Python
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers