内置组件 && vue中强大的缓存机制之keep-alive
vue中强大的缓存机制之keep-alive
最近在用vue做项目,在切换页面时发现切换回原来的页面无法保存原来的状态。 如A页面需要ajax请求数据,然后切换到B页面做某些事情,再切换回A页面时,A页面又再请求数据,但是作为前端,性能优化时必须要考虑的,并且,vue构建的单页面应用,大多数情况下是不需要重新请求数据的,这时keep-alive就派上用场了。
第一部分:vue中内置的组件
在vue中,为了方便开发者更好的使用vue,减少不必要的代码量,作者内置了一些组件,主要有:
- component组件
- transition组件
- transition-group组件
- keep-alive组件
- slot组件
(1). component组件
- props
- is 依照is的值,来决定使用哪个组件被渲染
- inline-template 布尔值
var vm = new Vue({
el: '#example',
data: {
currentView: 'home'
},
components: {
home: { /* ... */ },
posts: { /* ... */ },
archive: { /* ... */ }
}
})
即在components下设置多个组件。
<component v-bind:is="currentView">
<!-- 组件在 vm.currentview 变化时改变! -->
</component>
也可以直接绑定在对象上:
var Home = {
template: '<p>Welcome home!</p>'
}
var vm = new Vue({
el: '#example',
data: {
currentView: Home
}
})
(2) transition组件
- props
- name --- string,用于自动生成 CSS 过渡类名。例如:
name: 'fade'将自动拓展为.fade-enter,.fade-enter-active等。默认类名为"v"。 - appear --- boolean, 是否在初始渲染时使用过渡。默认为false。
- css --- boolean, 是否使用过渡类。默认为
true。如果设置为false,将只通过组件事件触发注册的 JavaScript 钩子。 - type --- boolean, 过渡事件类型,侦听过渡何时结束。有效值为
"transition"和"animation"。默认 Vue.js 将自动检测出持续时间长的为过渡事件类型。 - mode --- string,控制离开/进入的过渡时间序列。有效的模式有
"out-in"和"in-out";默认同时生效。 - enter-class --- string
- leave-class --- string
- enter-active-class --- string
- leave-active-class --- string
- appear-class --- string
- appear-active-class --- string
- name --- string,用于自动生成 CSS 过渡类名。例如:
- 事件
- before-enter
- enter
- after-enter
- before-leave
- leave
- after-leave
- before-appear
- appear
- after-appear
<transition> 元素作为单个元素/组件的过渡效果。<transition> 不会渲染额外的 DOM 元素,也不会出现在检测过的组件层级中。它只是将内容包裹在其中,简单的运用过渡行为。
<!-- 简单元素 -->
<transition>
<div v-if="ok">toggled content</div>
</transition>
<!-- 动态组件 -->
<transition name="fade" mode="out-in" appear>
<component :is="view"></component>
</transition>
<!-- 事件钩子 -->
<div id="transition-demo">
<transition @after-enter="transitionComplete">
<div v-show="ok">toggled content</div>
</transition>
</div>
new Vue({
...
methods: {
transitionComplete: function (el) {
// 传入 'el' 这个 DOM 元素作为参数。
}
}
...
}).$mount('#transition-demo')
(3). transition-group
tag- string, 默认为spanmove-class- 覆盖移动过渡期间应用的 CSS 类。- 除了
mode,其他特性和<transition>相同。
<transition-group> 元素作为多个元素/组件的过渡效果。<transition-group> 渲染一个真实的 DOM 元素。默认渲染 <span>,可以通过 tag 属性配置哪个元素应该被渲染。
注意,每个 <transition-group> 的子节点必须有 独立的key ,动画才能正常工作
<transition-group> 支持通过 CSS transform 过渡移动。当一个子节点被更新,从屏幕上的位置发生变化,它将会获取应用 CSS 移动类(通过 name 属性或配置 move-class 属性自动生成)。如果 CSS transform 属性是“可过渡”属性,当应用移动类时,将会使用 FLIP 技术 使元素流畅地到达动画终点。
(4). slot
不再赘述
第二部分: keep-alive
props包括:
- include --- 字符串或正则表达式。只有匹配的组件会被缓存。
- exclude --- 字符串或正则表达式。任何匹配的组件都不会被缓存。
用法:
<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。正如之前所说的,如果不使用keep-alive,每次切换到一个路由下的组件时,如果有请求,就会发起ajax请求,即在离开这个组件时就已经销毁了这个组件。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。
当组件在 <keep-alive> 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。主要用于保留组件状态或避免重新渲染。
<!-- 基本 -->
<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>
<!-- 和 <transition> 一起使用 -->
<transition>
<keep-alive>
<component :is="view"></component>
</keep-alive>
</transition>
include和exclude是vue2.1.0新增的:
<!-- 逗号分隔字符串 -->
<keep-alive include="a,b">
<component :is="view"></component>
</keep-alive>
<!-- 正则表达式 (使用 v-bind) -->
<keep-alive :include="/a|b/">
<component :is="view"></component>
</keep-alive>
注意:<keep-alive> 不会在函数式组件中正常工作,因为它们没有缓存实例。
第三部分:
<div id="app">
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
</div>
只有keep-alive设置为true的才可以被缓存:
routes: [
{
path: "/",
redirect: "/commodity",
},
{
path: '/Mall',
component: Mall,
name: "店铺",
meta: { keepAlive: false }
},
{
path: '/personal-center',
component: personalCenter,
name: "个人中心",
},
{
path: "/address",
component: AddressManage,
name: "地址管理"
},
{
path: '/order',
component: Myorder,
name: "我的订单"
},
{
path: '/commodity',
component: Commodity,
name: "商品",
meta: { keepAlive: true }
},
{
path:"/Mall/payment",
component: Ordersettlement,
name: "支付信息"
}
]
如下所示: 只有商品这一页才可以被缓存,其他的都不能缓存。

在这里,无论怎么切换路由,都只有Commodity一直存在,并且显示 inactive, 即不活跃,缓存的意思。
这时,我们可以在商品页设置一个 activated 钩子函数:
activated: function () {
alert("activated");
},
这时,只要从别的页面切换过来,都会alert activated,表示已经缓存了。
而其他的页面钩子函数 deactive 会被调用
第三部分: 遇到的坑
使用keep-alive固然是好,但是并不是所有情况下都适合使用keep-alive,因为keep-alive意味着页面省去了重新挂载渲染,这貌似很好,但是这更意味着我们没法使用 created updated mounted 这些生命周期钩子函数了,所以只有在固定不变的地方我们才建议使用keep-alive, 否则不适用。
比如下面的这个页面:

仅仅是介绍了一些店铺的基本信息,并没有介绍到更多的内容,所以这时我们就可以使用keep-alive了,但是,这时使用keep-alive并不是万能的,因为一旦用户刷新了页面,而我们的state是在首页获取的,就会出现问题。
所以,更为普遍的方法是下面这样的:
created () {this.updateMall();
}
即如果创建了新的页面,那么一定会触发created钩子函数,然后我们再去请求数据,这样就是一种很好的做法了。
内置组件 && vue中强大的缓存机制之keep-alive的更多相关文章
- 通俗易懂了解Vue内置组件keep-alive内部原理
1. 官方介绍及其用法 1.1 组件介绍 要想搞明白<keep-alive>组件的内部实现原理,首先我们得搞明白这个组件怎么用以及为什么要用它,关于<keep-alive>组件 ...
- Vue内置组件[回顾]
1.动态组件 在某些场景,往往需要我们动态切换页面部分区域的视图,这个时候内置组件component就显得尤为重要. component接收一个名为is的属性,is的值应为父组件中注册过的组件的名称, ...
- vue第十一单元(内置组件)
第十一单元(内置组件) #课程目标 熟练掌握component组件的用法 熟练使用keep-alive组件 #知识点 #1.component组件 component是vue的一个内置组件,作用是:配 ...
- 阅读vue源码-----内置组件篇(keep-alive)
1.前言: <keep-alive>是vue实现的一个内置组件,也就是说vue源码不仅实现了一套组件化的机制,也实现了一些内置组件. <keep-alive>官网介绍如下:&l ...
- Vue基础(环境配置、内部指令、全局API、选项、内置组件)
1.环境配置 安装VsCode 安装包管理工具:直接下载 NodeJS 进行安装即可,NodeJS自带 Npm 包管理工具,下载地址:https://nodejs.org/en/download/安装 ...
- Vue内置组件keep-alive的使用
本文主要介绍Vue内置组件keep-alive的使用. Vue内置组件keep-alive的使用 keep-alive接收三个props:●include - 字符串或正则表达式.只有名称匹配的组件会 ...
- form-create教程:给内置组件和自定义组件添加事件
本文将介绍form-create如何给内置组件和自定义组件添加事件 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue ...
- vue-learning:33 - component - 内置组件 - 过渡组件transition
vue内置过渡组件transition 目录 什么是过渡 基本过渡或动画实现的语法 css过渡动画:transition / animation js过渡:特定事件钩子函数 各种情形下的过渡实现,使用 ...
- Django:内置组件Content-Type
12.Django组件之Content_Type 1.帮助我们生成了一张表,里面有所有表名.这样不再自建表在表中填表名,用Foreignkey获取 2.为了让我们快速进入插入数据,填写一个字段Gene ...
随机推荐
- python -Tkinter 实现一个小计算器功能
文章来源:http://www.cnblogs.com/Skyyj/p/6618739.html 本代码是基于python 2.7的 如果是对于python3.X 则需要将 tkinter 改为Tk ...
- Android 动态改变图片的颜色值
public void onViewClicked(View view) { switch (view.getId()) { case R.id.bt1: img1.setColorFilter(ge ...
- HTML & CSS设计与构建网站 ([美]达科特) PDF原版
HTML & CSS 设计与构建网站采用有别于许多传统编程书籍的新颖编排方式,将使您收到事半功倍的学习效果.每一页都在短小精悍的示例代码的引导下,简明直观.直截了当地阐述一个新主题. < ...
- 排序算法汇总(java实现,附源代码)
整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了. ...
- React + Python 七月小说网 功能设计(二)
概述 在通过对世面上的各种小说网站简单了解之后(PS:好多盗版网站真的好丑哦.),去除花里胡哨的功能,保留实用功能. 初步制定了以下几个功能需求,当然,所有需求功能都是我自己设计.自己评审,大不了到时 ...
- Windows系统版本判定那些事儿[转]
Windows系统版本判定那些事儿 转自CSDN,原文链接,我比较不要脸, 全部给复制过来了 前言 本文并不是讨论Windows操作系统的版本来历和特点,也不是讨论为什么没有Win9,而是从程序员角度 ...
- 华硕X550VC安装ubuntu后wifi无法连接问题
在网上找了很多资料比如重新编译内核,想办法连上有线网络然后更新驱动,下载离线驱动安装包…… 等等方法 其中有些方法实际测试的时候失败了,文章是几年前的,可能缺少某些依赖.上个网都这么麻烦实在让人疲惫. ...
- LOJ#10106. 「一本通 3.7 例 2」单词游戏
题目链接:https://loj.ac/problem/10106 题目描述 来自 ICPC CERC 1999/2000,有改动. 有 NNN 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词. ...
- Agreement has been updated--Edit Phone Number最便捷解决办法(不需要安全提示问题和双重认证)
2018年06月04日亲测有效: CSDN博客跳转网址:
- [译文]Casperjs1.1.0参考文档-安装
安装 Casperjs能被安装在mac osx,windows 和大多数linux版本 依赖项 PhantomJS1.82及以上 Python2.6及以上(很多人忘了安装python导致安装失败) 1 ...