详解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 相关文章推荐
常用的javascript function代码
May 23 Javascript
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
Jun 02 Javascript
js自定义回调函数
Dec 13 Javascript
JS弹出窗口的运用与技巧大全
Nov 01 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
Dec 12 Javascript
jQuery实现简单弹窗遮罩效果
Feb 27 Javascript
js从输入框读取内容,比较两个数字的大小方法
Mar 13 Javascript
js 去掉字符串前后空格实现代码集合
Mar 25 Javascript
Vue响应式原理详解
Apr 18 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
May 17 Javascript
原生javascript实现文件异步上传的实例讲解
Oct 26 Javascript
纯js实现无缝滚动功能代码实例
Feb 21 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
php中实现简单的ACL 完结篇
2011/09/07 PHP
php DOS攻击实现代码(附如何防范)
2012/05/29 PHP
php添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
PHP实现AES256加密算法实例
2014/09/22 PHP
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
2013/11/12 Javascript
函数式 JavaScript(一)简介
2014/07/07 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
JS实现网页Div层Clone拖拽效果
2015/09/26 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
laydate时间日历插件使用方法详解
2018/11/14 Javascript
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
Python 专题四 文件基础知识
2017/03/20 Python
Python算法之图的遍历
2017/11/16 Python
在django view中给form传入参数的例子
2019/07/19 Python
Python如何实现强制数据类型转换
2019/11/22 Python
Python爬取股票信息,并可视化数据的示例
2020/09/26 Python
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
个人租房协议书
2014/11/28 职场文书
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏
nginx静态资源的服务器配置方法
2022/07/07 Servers