keep-alive

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keep-alive相关的知识,希望对你有一定的参考价值。

参考技术A keep-alive的作用

页面被keep-alive时,页面内的内容会被缓存,也就是说,切换到另外的页面时,keep-alive的页面不会被清除,返回这个页面后,自动返回到之前切换时的状态(比如表格的分页、滚动条的位置等)

keep-alive的属性

keep-alive有两个属性,分别为include 和exclude

include表示值为字符串或者正则表达式匹配的组件name会被缓存,匹配就缓存

exclude表示值为字符串或者正则表达式匹配的组件name不会被缓存,匹配就不缓存

keep-alive的机制

因为组件被缓存,所以并不会触发vue的destroy的钩子函数,并且之后再切换的时候也不会被重新创建,所以此时要使用activated与deactivated来获取当前组件是否处于活动状态

keep-alive实际运用

1.首先在路由中的mate属性中记录keepalive,如果需要缓存则设置为true

2.在创建router实例的时候加上scrollBehavior方法(keepAlive才会生效)

3.需要缓存的router-view包上keep-alive(要有两个router-view,一个是缓存的时候显示,一个是不缓存的时候显示,有的时候不需要缓存)

vue中的keep-alive

官方文档:

keep-alive

如果把切换出去的组件保留在内存中,可以保留它的状态或避免重新渲染。为此可以添加一个 keep-alive 指令参数:

<keep-alive>
  <component :is="currentView">
    <!-- 非活动组件将被缓存! -->
  </component>
</keep-alive>
  • Props:

    • include - 字符串或正则表达式。只有匹配的组件会被缓存。
    • exclude - 字符串或正则表达式。任何匹配的组件都不会被缓存。
  • 用法:

    <keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。

    当组件在 <keep-alive> 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。

    在 2.2.0 及其更高版本中,activated 和 deactivated 将会在 <keep-alive> 树内的所有嵌套组件中触发。

2.1.0 新增:include 和 exclude 属性允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示:

<!-- 逗号分隔字符串 -->
<keep-alive include="a,b">
  <component :is="view"></component>
</keep-alive>

<!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/">
  <component :is="view"></component>
</keep-alive>

<!-- 数组 (使用 `v-bind`) -->
<keep-alive :include="[‘a‘, ‘b‘]">
  <component :is="view"></component>
</keep-alive>

匹配首先检查组件自身的 name 选项,如果 name 选项不可用,则匹配它的局部注册名称 (父组件 components 选项的键值)。匿名组件不能被匹配。

<keep-alive> 不会在函数式组件中正常工作,因为它们没有缓存实例。

动态判断
<keep-alive :include="includedComponents">
  <router-view></router-view>
</keep-alive>

includedComponents动态设置即可

在2.1.0之前,我们可以这样做:

缓存部分页面或者组件

(1)使用router.mate属性
// 这是目前用的比较多的方式
<keep-alive>
    <router-view v-if="!$route.meta.notKeepAlive"></router-view>
</keep-alive>
<router-view v-if="$route.meta.notKeepAlive"></router-view>
router设置
 routes: [
    { path: ‘/‘, redirect: ‘/index‘,  component: Index, mate: { keepAlive: true }},
    {
      path: ‘/common‘,
      component: TestParent,
      children: [
        { path: ‘/test2‘, component: Test2, mate: { keepAlive: true } } 
      ]
    }
// 表示index和test2都使用keep-alive

参考链接:http://www.jianshu.com/p/e4bd12e789dd

以上是关于keep-alive的主要内容,如果未能解决你的问题,请参考以下文章

Vue / keep-alive使用

vue列表缓存keep-alive

前端性能优化-keep-alive

683 vue3的动态组件,keep-alive,缓存组件的生命周期,异步组件和Suspense,$refs,$parent和$root,生命周期,组件的v-model