vue 指定组件缓存实例详解
时间:2019-04-13
本文章向大家介绍vue 指定组件缓存实例详解,主要包括vue 指定组件缓存实例详解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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 并不能有效的缓存了= =
- 网络域名与注册商标冲突的解决途径
- 网站代码优化我们必须要做的那些事
- 真是热闹! Slade.com等多个域名被曝交易
- python编码问题之"encode"&"decode"
- python3编码问题终结者--还搞不懂你来找我
- Pycharm集成PyQt4并使用
- python遍历一个目录,输出所有文件名
- pyqt4实现tab界面切换
- 腾讯云Fintech云端系列论坛首站北京,揭秘如何全链路赋能互联网金融
- Flask入门笔记(一)
- 刷脸还是指纹识别,that's a question
- c#:使用using关键字自动释放资源未必一定就会有明显好处
- MongoDB 学习笔记(原创)
- Silverlight:ScorllViewer随Tab键自动跟随子控件的Focus滚动
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 模型评价指标—KS
- python 学习之:修饰器
- python 学习之:正则表达式(1)---- 可选函数参数
- PySpark——开启大数据分析师之路
- 一款直击痛点的优秀http框架,让我超高效率完成了和第三方接口的对接
- 强连通和连通算法在关联图谱中的应用
- PySpark SQL——SQL和pd.DataFrame的结合体
- 初识Kubernetes及快速安装
- 使用k8s部署springboot+redis简单应用
- React Ref 使用总结
- Python人脸识别—我的眼里只有你
- 函数式编程是如何提升代码的扩展性
- 浏览器中的跨域问题与 CORS
- 微信小程序怎么做链接可以链到小程序的其它页面。
- 如何实现一个 3D 效果的魔方