vue内置组件之keep-alive

怎么介绍呢,只能说是我今年面试的时候每一家公司都问了,好了正片开始。

什么是keep-alive

<keep-alive>是一个内置组件,允许我们在多个组件之间动态切换时,有条件地缓存组件实例。使被包含的组件保留状态,或避免重新渲染

为什么使用

在开发过程中,有部分组件没有必要多次初始化,这时,我们就需要将组件进行持久化,使组件的状态维持不变,在下一次展示时,组件也不会进行重新初始化。

用法

含有属性:

  • include: String| RegExp | Array。只有匹配的组件会被缓存。(使用字符串形式时用‘ , ’隔开且组件名之间不要留有空格)
  • exclude: String| RegExp | Array。任何匹配的组件都不会被缓存。(使用字符串形式时用‘ , ’隔开且组件名之间不要留有空格)
  • max:Number | String。缓存的组件实例的最大数量,如果缓存实例的数量即将超过指定的最大计数,则最近访问最少的缓存实例将被销毁,以便为新实例腾出空间。
    基本用法:
<!--被keepalive包含的组件会被缓存-->
<keep-alive>
    <component><component />
</keep-alive>

有其他属性时:

<!-- 只缓存组件name为a或者b的组件, 结合动态组件使用,currentTab是我data中定义的动态组件名,下面情况相同,就不做相同解释了 -->
 <keep-alive exclude="a,b">
   <component :is="currentTab"></component>
 </keep-alive>

<!-- 组件名为c的组件不缓存,即不重新渲染-->
<keep-alive exclude="c"> 
    <component :is="currentTab"></component>
</keep-alive>

<!-- 使用正则表达式,需使用v-bind -->
<keep-alive :include="/a|b/">
    <component :is="currentTab"></component>
</keep-alive>

<!-- 如果同时使用include,exclude,那么exclude优先于include, 下面的例子只缓存a,c组件 -->
<keep-alive include="a,b,c" exclude="b"> 
    <component :is="currentTab"></component>
</keep-alive>

<!-- 如果缓存的组件超过了max设定的值5,那么将删除第一个缓存的组件 -->
<keep-alive exclude="a" max="5"> 
    <component :is="currentTab"></component>
</keep-alive>

注:\color{#0580CF} {当使用正则表达式或者数组时,一定要使用 v-bind。}
\color{#0580CF} {在此include和exclude后面跟的是组件名!}

生命周期

当我们缓存某组件实例时,它会进入停用状态而不是被卸载。当组件实例作为缓存树的一部分插入 DOM 时,它会被激活。

keep-alive 中创建的组件,会多出两个生命周期的钩子: activateddeactivated

  • activated 当 keepalive 包含的组件被激活(使用)的时候触发,可以简单理解为进入这个页面的时候触发
  • deactivated 当 keepalive 包含的组件不被使用(inactive状态)的时候触发,可以简单理解为离开这个页面的时候触发
    假设我们缓存About组件,在About组件中编写以下代码并执行:
  created() {
    console.log("我是created钩子");
  },
  mounted() {
    console.log("我是mounted钩子");
  },
  activated() {
    console.log("我是activated钩子");
  },
  deactivated() {
    console.log("我是deactivated钩子");
  },
  beforeDestroy() {
    console.log("我是beforeDestroy钩子");
  },

首次进入页面,钩子的触发顺序:
我是created钩子 —〉 我是mounted钩子 —〉 我是activated钩子
离开页面:
我是deactivated钩子
——————————————————————————————
再次进入:
我是activated钩子
离开:
我是deactivated钩子

\color{#0580CF} {我们可以将只执行一次的放在 mounted 中,组件每次进去执行的方法放在 activated 中。}

vue-router 结合router使用

基本使用:

//缓存所有
<keep-alive>
    <router-view>
    </router-view>
</keep-alive>

如果我们要缓存部分:

  1. 使用 include/ exclude
  2. 使用meta属性
    第一种方式的使用方式:
//只有路径匹配到的 include 为 home 组件会被缓存 
<keep-alive include="home">
    <router-view>
    </router-view>
</keep-alive>

exclude用法类似,我就不演示了,大家可以自己试一下
第二种方式:

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

router中进行相应配置:

export default new Router({
  routes: [
    {
      path: '/home',
      name: 'Home',
      component: Home,
      meta: {
        keepAlive: false // 不需要缓存
      }
    },
    {
      path: '/About',
      name: 'About',
      component: About,
      meta: {
        keepAlive: true // 需要被缓存
      }
    }
  ]
})

另外说个之前朋友在群里问的一个问题,原纪录找不到了,大体意思就是Home,About,List三个组件,Home跳List List不刷新,About跳List List刷新
说下如何实现哈:
可以像上面一样,给List设置下meta
然后在 Home 组件里面设置 beforeRouteLeave:

 beforeRouteLeave(to, from, next) {
  // 设置下一个路由的 meta。可以先判断下是否是List,我这就不判断了,直接写keepAlive配置了
  to.meta.keepAlive = true;  // 让 List 缓存,即不刷新
  next();
}

然后在 About 组件里面设置 beforeRouteLeave:

 beforeRouteLeave(to, from, next) {
  // 设置下一个路由的 meta。同样可以先判断一下我就不写了
  to.meta.keepAlive = false;  // 让 List 不缓存
  next();
}

完结撒花🎉,如有不对欢迎指正。觉得有帮助的话记得点个赞哦~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容