详解Vue中组件的缓存


Posted in Javascript onApril 20, 2019

之前在《Vue一个案例引发的动态组件与全局事件绑定总结》这篇文章中简单提到过组件的缓存。当时只是简单的提供了一个解决问题的思路,并没有说到多少组件缓存的东西,今天我们就来详细说说组件的缓存。

组件化开发模式下,我们会把整个项目拆分成很多组件,然后按照合理的方式组织起来。

自然就存在组件之间的切换问题,Vue 中有个「动态组件」的概念,它能够让我们更好的实现组件的切换。

在实际的项目开发中,产品是不可能放过我们的,需求总是在不停的变化,如果你碰到那些不改需求的产品就嫁了吧,太难得了。

最近项目中需要实现一个保留上一次Tab 页的功能。如下图,当我选择 B 组件时,我希望从首页切换到设置页时,还会停留在 B 组件,而不是重新渲染为默认的 A 组件。

详解Vue中组件的缓存

首先我们可以使用内置组件 <component>实现动态组件的效果。

<template>
 <div>
   <button
    v-for="tab in tabs"
    :key="tab"
    @click="currentTab = tab"
   ></button>
  <component :is="currentTab"></component>
 </div>
</template>
<script>
export default {
 name: "Tab",
 data() {
  return {
   currentTab: "A",
   tabs: ['A','B']
  };
 }
};
</script>

这时,我们做到了两个组件之间的切换,但动态组件在切换的过程中,组件的实例都是「重新创建」的,而我们需要保留组件状态。

为了解决这个问题,你还需要使用 vue 内置组件 <keep-alive>。

keep-alive

keep-alive 包裹「动态组件」时,会缓存不活动的组件实例,而不是销毁它们。它是一个抽象的组件,它自身不会渲染成一个 DOM 元素,也不会出现在父组件链中。

值得注意的是 「动态组件」这四个字,它只有在包含动态组件时,才会产生效果。如果不是动态组件则会无效。比如下面这种用法是没有效果的。

<keep-alive>
  <my-component></my-component>
</keep-alive>

既然如此,我们来看看 keep-alive 常用的几种方式:

方案一: 使用内置组件 <component>。

<keep-alive>
 <component :is="view"></component>
</keep-alive>

方案二: 当出现条件判断时的子组件

<keep-alive>
 <comp-a v-if="a > 1"></comp-a>
 <comp-b v-else></comp-b>
</keep-alive>

方案三: 结合路由使用时

<keep-alive>
   <router-view></router-view>
 </keep-alive>

以上三种方式组件都会被缓存。另外一点需要注意的是,<keep-alive> 只能用在只有一个子组件的情况。如果你在其中有 v-for 则不会产生效果。

明白了如何使用 <keep-alive> 时,想要保留我们的 Tab 页,我们只需这么做即可。

<keep-alive>
  <router-view></router-view>
</keep-alive>

但是这里你会发现,我们把每一个组件都缓存了起来,不仅案例中的「设置页」被缓存连「首页」也一起被缓存了起来,这不是我们想要的。

vue 帮我们也考虑到了这一点,所以我们可以选择性的进行组件的缓存,也就是说你想让谁缓存,就让谁缓存,非常的自由与可配置。

原因是因为 <keep-alive> 提供了两个属性 include 与 exclude。

  1. include:只有名称匹配的组件会被缓存。
  2. exclude:任何名称匹配的组件都不会被缓存。

 二者都可以用逗号分隔字符串、正则表达式或一个数组来表示。

<keep-alive include="a,b"></keep-alive>
<keep-alive :include="/a|b/"></keep-alive>
<keep-alive :include="['a', 'b']"></keep-alive>

所以,结合 <keep-alive> 的 include 或 exclude属性,我们就可以轻易的选择需要缓存的组件。

<keep-alive include="system">
  <router-view></router-view>
</keep-alive>

这样我们就可以只缓存「设置页」,然后实现保留上次选择的 Tab 页。

以上所述是小编给大家介绍的Vue中组件的缓存详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Jquery下attr和removeAttr的使用方法
Dec 28 Javascript
jQuery图片预加载 等比缩放实现代码
Oct 04 Javascript
JQuery中对Select的option项的添加、删除、取值
Aug 25 Javascript
jQuery常用且重要方法汇总
Jul 13 Javascript
javascript精确统计网站访问量实例代码
Dec 19 Javascript
Angular 4.x中表单Reactive Forms详解
Apr 25 Javascript
基于node简单实现RSA加解密的方法步骤
Mar 21 Javascript
浅谈js闭包理解
Apr 01 Javascript
如何测量vue应用运行时的性能
Jun 21 Javascript
vue解决花括号数据绑定不成功的问题
Oct 30 Javascript
js属性对象的hasOwnProperty方法的使用
Feb 05 Javascript
原生Javascript+HTML5一步步实现拖拽排序
Jun 12 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
Apr 20 #Javascript
优雅地使用loading(推荐)
Apr 20 #Javascript
详解JavaScript的数据类型以及数据类型的转换
Apr 20 #Javascript
详解key在Vue列表渲染时究竟起到了什么作用
Apr 20 #Javascript
函数式编程入门实践(一)
Apr 20 #Javascript
vue路由对不同界面进行传参及跳转的总结
Apr 20 #Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
Apr 20 #Javascript
You might like
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
JavaScript获取表单内所有元素值的方法
2015/04/02 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
javascript 判断两个日期之差的示例代码
2015/09/05 Javascript
jQuery密码强度检测插件passwordStrength用法实例分析
2015/10/30 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
AngularJS ng-change 指令的详解及简单实例
2016/07/30 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
JS跨域请求的问题解析
2018/12/03 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
Vue.extend 登录注册模态框的实现
2020/12/29 Vue.js
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
pytorch之添加BN的实现
2020/01/06 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
什么是servlet
2012/05/08 面试题
车间班长岗位职责
2013/11/30 职场文书
旅游管理专业生自荐信范文
2014/01/02 职场文书
租房协议书范文
2014/08/20 职场文书
质量主管工作职责
2014/09/26 职场文书
公诉意见书范文
2015/06/05 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
Promise面试题详解之控制并发
2021/05/14 面试题
浅析Python OpenCV三种滤镜效果
2022/04/11 Python