详解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 相关文章推荐
use jscript with List Proxy Server Information
Jun 11 Javascript
JS实现随机化快速排序的实例代码
Aug 01 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
Aug 02 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
Mar 05 Javascript
AngularJS快速入门
Apr 02 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
Dec 16 Javascript
浅析Javascript匿名函数与自执行函数
Feb 06 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
Oct 31 Javascript
javascript  数组排序与对象排序的实例
Jul 17 Javascript
Nuxt.js之自动路由原理的实现方法
Nov 21 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
Oct 26 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
Oct 29 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生成静态页的实现方法
2013/05/10 PHP
PHP5函数小全(分享)
2013/06/06 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
浅谈javascript中关于日期和时间的基础知识
2016/07/13 Javascript
浅谈js的异步执行
2016/10/18 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
JS数组转字符串实现方法解析
2020/09/04 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
[57:50]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第二局
2016/03/05 DOTA
BP神经网络原理及Python实现代码
2018/12/18 Python
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
网络、C以及其他硬件方面的面试题
2016/08/23 面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
教师评语大全
2014/04/28 职场文书
新手上路标语
2014/06/20 职场文书
电子专业自荐信
2014/07/01 职场文书
优秀团员事迹材料
2014/12/25 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书