深入理解与使用keep-alive(配合router-view缓存整个路由页面)

在搭建 vue 项目时,有某些组件没必要多次渲染,所以需要将组件在内存中进行‘持久化‘,此时 <keep-alive> 便可以派上用场了。 <keep-alive> 可以使被包含的组件状态维持不变,即便是组件切换了,其内的状态依旧维持在内存之中。在下一次显示时,也不会重现渲染。

PS:<keep-alive> 与 <transition>相似,只是一个抽象组件,它不会在DOM树中渲染(真实或者虚拟都不会),也不在父组件链中存在,比如:你永远在 this.$parent 中找不到 keep-alive 。

1. keep-alive的基础使用

最基础的一般是结合动态组件去使用:

?


1

2

3

4

5

6

7

8

9

10

11

12

<keep-alive>

  <component :is="currentView"></component>

</keep-alive>

new Vue({

  el: ‘#app‘,

  data(){

    return {

      currentView: Test //Test为引入的子组件

    }

  }

})

不过此种方式并无太大的实用意义。

2. 生命周期钩子

被包含在 <keep-alive> 中创建的组件,会多出两个生命周期的钩子: activated 与 deactivated

activated

在组件被激活时调用,在组件第一次渲染时也会被调用,之后每次keep-alive激活时被调用。

deactivated

在组件被停用时调用。

注意:只有组件被 keep-alive 包裹时,这两个生命周期才会被调用,如果作为正常组件使用,是不会被调用,以及在 2.1.0 版本之后,使用 exclude 排除之后,就算被包裹在 keep-alive 中,这两个钩子依然不会被调用!另外在服务端渲染时此钩子也不会被调用的。

3. 配合router-view使用

有些时候可能需要将整个路由页面一切缓存下来,也就是将 <router-view> 进行缓存。这种使用场景还是蛮多的。

在vue 2.1.0 之前,大部分是这样实现的:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<!-- template -->

<keep-alive>

  <router-view v-if="$router.meta.keepAlive"></router-view>

</keep-alive>

<router-view v-if="!$router.meta.keepAlive"></router-view>

//router配置

new Router({

  routes: [

    {

      name: ‘a‘,

      path: ‘/a‘,

      component: A,

      meta: {

        keepAlive: true

      }

    },

    {

      name: ‘b‘,

      path: ‘/b‘,

      component: B

    }

  ]

})

这样配置路由的路由元信息之后,a路由的 $router.meta.keepAlive 便为 true ,而b路由则为 false 。
所以为 true 的将被包裹在 keep-alive 中,为 false 的则在外层。这样a路由便达到了被缓存的效果,如果还有想要缓存的路由,只需要在路由元中加入 keepAlive: true 即可。

4. 在2.1.0版本之后

在vue 2.1.0 版本之后,keep-alive 新加入了两个属性: include(包含的组件缓存生效) 与 exclude(排除的组件不缓存,优先级大于include) 。

include 和 exclude 属性允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示。
当使用正则或者是数组时,一定要使用 v-bind !

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

<!-- 逗号分隔字符串,只有组件a与b被缓存。这样使用场景变得更有意义了 -->

<keep-alive include="a,b">

 <component :is="view"></component>

</keep-alive>

<!-- 正则表达式 (需要使用 v-bind,符合匹配规则的都会被缓存) -->

<keep-alive :include="/a|b/">

 <component :is="view"></component>

</keep-alive>

<!-- Array (需要使用 v-bind,被包含的都会被缓存) -->

<keep-alive :include="[‘a‘, ‘b‘]">

 <component :is="view"></component>

</keep-alive>

有了include之后,再与 router-view 一起使用时便方便许多了:

?


1

2

3

4

<!-- 一个include解决了,不需要多写一个标签,也不需要在路由元中添加keepAlive了 -->

<keep-alive include=‘a‘>

  <router-view></router-view>

</keeo-alive>

5. 需要注意的地方

    • <keep-alive> 先匹配被包含组件的 name 字段,如果 name 不可用,则匹配当前组件 componetns 配置中的注册名称。
    • <keep-alive> 不会在函数式组件中正常工作,因为它们没有缓存实例。
    • 当匹配条件同时在 include 与 exclude 存在时,以 exclude 优先级最高(当前vue 2.4.2 version)。比如:包含于排除同时匹配到了组件A,那组件A不会被缓存。
    • 包含在 <keep-alive> 中,但符合 exclude ,不会调用activated 和 deactivated

原文地址:https://www.cnblogs.com/aillabig/p/9786048.html

时间: 2024-11-26 14:59:16

深入理解与使用keep-alive(配合router-view缓存整个路由页面)的相关文章

理解saltstack 里cmd.run 配合onlyif和unless使用

自己琢磨的好几天就是光看资料,还是没琢磨明白,建议大家一定 要亲自动手在机器上测试下.我们以saltstack管理tomcat启动与重启为例子: master主机上目录结构如下 [[email protected] salt]# pwd /srv/salt [[email protected] salt]# tree . ├── app │?? ├── files │?? │?? └── server.xml │?? └── tomcat.sls └── prod ├── services └─

element-ui,router.push到其他路由,菜单栏不会高亮对应的路由

使用饿了吗的路由,使用this.$router.push({path: ''})跳到其他的路由,菜单不会高亮. 如图所示,点击图上三个位置,需要使用this.$router.push({path: ''})跳到其他的路由,但是跳过去之后,左侧的菜单并不会高亮,查资料后说的是要把路由写的和index一样,但是没有解决,后来才知道,使用vue的bus解决. 1.在assets文件夹下建js/bus.js import Vue from 'vue' export default new Vue() 2

《深入理解mybatis原理7》 MyBatis的二级缓存的设计原理

<深入理解mybatis原理> MyBatis的二级缓存的设计原理 MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 1.MyBatis的缓存机制整体设计以及二级缓存的工作模式 如上图所示,当开一个会话时,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章.如果用户配置了"cache

《深入理解mybatis原理6》 MyBatis的一级缓存实现详解 及使用注意事项

<深入理解mybatis原理> MyBatis的一级缓存实现详解 及使用注意事项 0.写在前面   MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上.MyBatis提供了一级缓存.二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能.本文的目的则是向读者详细介绍MyBatis的一级缓存,深入源码,解析MyBatis一级缓存的实现原理,并且针对一级缓存的特点提出了在实际使用过程中应该注意的事项. 读完本文,你将会学到: 1.什么是一

animate.css配合wow.min.js实现各种页面滚动效果

有的页面在向下滚动的时候,有些元素会产生细小的动画效果.虽然动画比较小,但却能吸引你的注意.比如刚刚发布的 iPhone 6 的页面(查看).如果你希望你的页面也更加有趣,那么你可以试试 WOW.js. WOW.js 依赖 animate.css,所以它支持 animate.css 多达 60 多种的动画效果,能满足您的各种需求. html中使用方法: <div class="row wow fadeInUp" data-wow-duration="1s" d

React Router 4.0 ---- 嵌套路由和动态路由

嵌套路由,从广义上来说,分为两种情况:一种是每个路由到的组件都有共有的内容,这时把共有的内容抽离成一个组件,变化的内容也是一个组件,两种组件组合嵌套,形成一个新的组件.另一种是子路由,路由到的组件内部还有路由. 对于共有的内容,典型的代表就是网页的侧边栏,假设侧边栏在左边,我们点击其中的按钮时,右侧的内容会变化,但不管右侧的内容怎么变化,左侧的侧边栏始终存在.这个侧边栏就是共有内容,如下图所示 这个共有内容要怎么处理? 首先想到的就是把这个功能提取出来,写成一个组件,然后再把这个组件依次应用到其

我所理解的Android和iOS上的View

View,几乎是所有界面系统中的基类,在iOS里面是UIView,在Android里是View. 那么,到底View是什么东西,他做了些什么,他是怎么做到的,在这篇文章中,希望能带给大家一些启发. 抽象 View实际上是一个抽象类,他负责对渲染.布局以及触摸事件进行抽象. 渲染抽象 我们知道,不管是 iOS 还是 Android,他们的渲染引擎都是 OpenGL,OpenGL是面向C语言的(当然,在Objective-C和Java中都有封装).而作为前端开发者,要直接使用OpenGL编写界面,真

Vue的钩子函数[路由导航守卫、keep-alive、生命周期钩子]

前言 说到Vue的钩子函数,可能很多人只停留在一些很简单常用的钩子(created,mounted),而且对于里面的区别,什么时候该用什么钩子,并没有仔细的去研究过,且Vue的生命周期在面试中也算是比较高频的考点,那么该如何回答这类问题,让人有眼前一亮的感觉呢... 前端进阶积累.公众号.GitHub Vue-Router导航守卫: 有的时候,我们需要通过路由来进行一些操作,比如最常见的登录权限验证,当用户满足条件时,才让其进入导航,否则就取消跳转,并跳到登录页面让其登录. 为此我们有很多种方法

webpack入坑之旅(六)配合vue-router实现SPA

这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不是开始的开始 webpack入坑之旅(二)loader入门 webpack入坑之旅(三)webpack.config入门 webpack入坑之旅(四)扬帆起航 webpack入坑之旅(五)加载vue单文件组件 webpack入坑之旅(六)配合vue-router实现SPA 在上面的练习当中我们已经成