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


Posted in Javascript onSeptember 25, 2018

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

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

1. keep-alive的基础使用

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

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

new Vue({
  el: '#app',
  data(){
    return {
      currentView: Test //Test为引入的子组件
    }
  }
})

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

2. 生命周期钩子

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

activated

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

deactivated

在组件被停用时调用。

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

3. 配合router-view使用

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

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

<!-- 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) 。

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

<!-- 逗号分隔字符串,只有组件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 一起使用时便方便许多了:

<!-- 一个include解决了,不需要多写一个标签,也不需要在路由元中添加keepAlive了 -->
<keep-alive include='a'>
  <router-view></router-view>
</keeo-alive>

5. 需要注意的地方

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ExtJs GridPanel简单的增删改实现代码
Aug 26 Javascript
js实现带搜索功能的下拉框实时搜索实时匹配
Nov 05 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
Dec 05 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
Feb 26 Javascript
JavaScript实现鼠标点击后层展开效果的方法
May 13 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
Sep 01 Javascript
JavaScript 不支持 indexof 该如何解决
Mar 30 Javascript
Bootstrap3制作自己的导航栏
May 12 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
Dec 14 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
Oct 25 Javascript
关于微信小程序登录的那些事
Jan 08 Javascript
浅入深出Vue之自动化路由
Aug 06 Javascript
使用vue2.0创建的项目的步骤方法
Sep 25 #Javascript
vue解决一个方法同时发送多个请求的问题
Sep 25 #Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
Sep 25 #Javascript
在vue中多次调用同一个定义全局变量的实例
Sep 25 #Javascript
vue观察模式浅析
Sep 25 #Javascript
详解搭建es6+devServer简单开发环境
Sep 25 #Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
Sep 25 #Javascript
You might like
在PHP中读取和写入WORD文档的代码
2008/04/09 PHP
php fsockopen解决办法 php实现多线程
2014/01/20 PHP
php轻松实现中英文混排字符串截取
2014/05/28 PHP
thinkPHP的表达式查询用法详解
2016/09/14 PHP
js身份证验证超强脚本
2008/10/26 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
js打造数组转json函数
2015/01/14 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
jQuery中通过ajax的get()函数读取页面的方法
2016/02/29 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
前端开发基础javaScript的六大作用
2020/08/06 Javascript
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
天游软件面试
2013/11/23 面试题
初中生自我评价
2014/02/01 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
优秀教师个人总结
2015/02/11 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
圣诞晚会主持词
2015/07/01 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python