vue中的keep-alive

文章类型:Vue

发布者:admin

发布时间:2023-03-26

一般结合路由和动态组件一起使用,keep-alive 是内置的一个组件,可以实现组件缓存,不会重走生命周期函数,

切换时不会对当前组件进行卸载

<keep-alive></keep-alive> 包裹动态组件时,会缓存不活动的组件实例,主要用于保留组件状态或避免重新渲染

一:基本用法

1:属性,允许组件有条件的进行缓存

includes:=>只有匹配的组件会被缓存 (字符串、数组、正则表达式)

exclude:=>任何匹配的组件都不会被缓存(字符串、数组、正则表达式)

max:=>缓存组件的最大值(类型为字符或者数字、控制缓存组件的个数)

2:exclude 的优先级比 include 高

3:两个钩子函数 activated(激活时触发) 和deactivated(移除时触发)

首次进入组件时:beforeRouteEnter > beforeCreate > created> mounted > activated > ... ... > beforeRouteLeave > deactivated

再次进入组件时:beforeRouteEnter >activated > ... ... > beforeRouteLeave > deactivated

<keep-alive>  <component :is="view"></component></keep-alive><!-- 字符串方式 --><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>

二:使用场景

某些场景下不需要让页面重新加载

使用 meta 属性,在路由中配置keepAlive设置是否缓存

      {       path:'list',       name:'itemList',// 列表页       component(resolve){require(['@/pages/item/list'], resolve)},       meta:{keepAlive:true,title:'列表页'}}          <keep-alive>        <!-- 需要缓存的视图组件 -->        <router-view v-if="$route.meta.keepAlive"></router-view>     </keep-alive>      <!-- 不需要缓存的视图组件 -->     <router-view v-if="!$route.meta.keepAlive"></router-view>


三:缓存后如何更新数据

1:beforeRouteEnter:组件渲染会进入

beforeRouteEnter(to, from, next){    next(vm=>{        console.log(vm)        // 每次进入路由执行        vm.getData()  // 获取数据    })},

2:actived:在被激活,会执行actived钩子

// 注意:服务器端渲染期间avtived不被调用activated(){  this.getData() // 获取数据},

3:deactivated,失活情况

deactivated(){}

四:版本区别

1:vue3在路由使用中需要用到插槽来进行,组件内使用无变化

      <roter-view v-slot="{Component}">
      </roter-view>

五:注意点

1:先匹配被包含组件的 name 字段,如果 name 不可用,则匹配当前组件 components 配置中的注册名称

2: 不会在函数式组件中正常工作,没有缓存实例

3:当匹配条件同时在 include 与 exclude 存在时,以 exclude 优先级最高

4:包含在 keep-alive 中,但符合 exclude ,不会调用activated和 deactivated