关于前端:vue中的keepalive的用法详细讲解

4次阅读

共计 4424 个字符,预计需要花费 12 分钟才能阅读完成。

问题形容(什么是 keep-alive)

  • keep-alive 顾名思义,放弃沉闷。放弃谁沉闷呢?
  • 首先咱们晓得,因为 vue 就是组件化编程,一个.vue 文件就是一个组件。就像万事万物一样,都有从出世到沦亡的生命周期过程,vue 的组件也是一样,也有本人的生命周期,比方 create 创立组件、mounted 往组件上挂数据、update 更新组件上挂的数据,destroy 把组件实例销毁。
  • 所以应用 keep-alive 就是放弃组件沉闷,不会被 destroy 销毁掉,就始终还活着,组件没有被销毁掉的话,组件上挂载的数据就还存在,所以状态就能够保留,所以,keep-alive 就能够放弃组件的状态。

http 协定的申请头外面也有一个 keep-alive,放弃 http 通话,这样:Connection: keep-alive 性能尽管不一样,然而思维上是一样的即为~ 放弃状态沉闷

小 demo,看一下 keep-alive 的应用成果

demo 分为下面的路由导航局部,上面的内容区局部。点击下面的路由导航,路由视图渲染对应的路由组件。效果图如下:

未应用 keep-alive 的效果图

对应代码

// #App.vue 中
<template>
  <div class="box">
    <!-- 路由导航 -->
    <div class="nav">
      <router-link to="/"> 去 home 页面 </router-link>
      <router-link to="/about"> 去 about 页面 </router-link>
      <router-link to="/detail"> 去 detail 页面 </router-link>
    </div>
    <!-- 路由导航对应的内容区 -->
    <main>
      <router-view></router-view>
    </main>
  </div>
</template>

// home.vue 中,搁置一个复选框
<el-checkbox v-model="checked"> 备选项 </el-checkbox>

// about.vue 中,搁置一个输入框
<el-input v-model="input" placeholder="请输出内容"></el-input>

// detail.vue 中形式一个下拉框
<el-select v-model="value" placeholder="请抉择">
  <el-option
    v-for="item in options"
    :key="item.value"
    :label="item.label"
    :value="item.value"
  >
  </el-option>
</el-select>

剖析

  • 咱们发现,当咱们没有应用 keep-alive 组件包裹住 router-view 视图组件的时候,右边~ 咱们在去 home 页面勾选了,在去 about 页面输出了,在去 detail 页面下拉抉择了,来到这个路由页面,再回来时,咱们发现咱们之前做的操作,勾选、输出、下拉抉择都不存在了,之前的状态都没了。起因很简略,当来到这个路由页面的时候,会触发这个路由页面对应组件上的 destroy 钩子办法,而后这个路由页面对应的组件就被销毁了,组件销毁了,组件上的挂载的数据也就啥也没有了。
  • 与此同时,咱们能够看到在左边的 Vue.js devtools 工具中,router-view 视图层始终只是 home、about、detail 组件来回切换,组件来回切换,其实就是组件一直的创立、销毁的过程。加下来咱们看看应用 keep-alive 的成果。

应用 keep-alive 的效果图

对应代码

<template>
  <div class="box">
    <!-- 路由导航 -->
    <div class="nav">
      <router-link to="/"> 去 home 页面 </router-link>
      <router-link to="/about"> 去 about 页面 </router-link>
      <router-link to="/detail"> 去 detail 页面 </router-link>
    </div>
    <!-- 路由导航对应的内容区 -->
    <main>
      <keep-alive> <!-- 应用 keep-alive 包了一层,就能够缓存啦 -->
        <router-view></router-view>
      </keep-alive>
    </main>
  </div>
</template>

剖析

  • 咱们给视图层组件应用 keep-alive 包住当前,咱们发现,咱们勾选、输出、下拉抉择的内容,在路由来回切换的时候,就不会失落了,即应用 keep-alive 保留了之前的组件状态
  • 与此同时,咱们能够看到在左边的 Vue.js devtools 工具中,在 router-view 视图中对应的,切换过来的组件曾经处于 inactive 状态,inactive 英文意思是不流动的、未应用的,即曾经缓存的,没有销毁的。所以组件上的咱们所做的操作、组件的状态就被缓存了,所以咱们勾选的、输出的、下拉抉择的都还在。

Vue.js devtools 挺好用,能够通过谷歌下载,vue 开发中的很好的工具

引出问题

看到这里咱们发现,间接加上 keep-alive 的话,会把所有的 router-view 层级下的视图的组件都缓存了,不过有的时候,咱们只想缓存局部,不想缓存所有的,那这怎么办呢?没关系,大佬们已思考到了,曾经提前为咱们解决好了,就是 keep-alive 中的 include、exclude 属性

include 和 exclude 指定是否缓存某些组件

include 属性

include 蕴含的意思。值为字符串或正则表达式或数组。只有组件的名称与 include 的值雷同的才会被缓存,即指定哪些被缓存,能够指定多个被缓存。这里以字符串为例,指定多个组件缓存,语法是用逗号隔开。如下:

// 指定 home 组件和 about 组件被缓存
<keep-alive include="home,about" >
    <router-view></router-view>
</keep-alive>

exclude 属性

exclude 相当于 include 的反义词,就是除了的意思,指定哪些组件不被缓存,用法和 include 相似,如下:

// 除了 home 组件和 about 组件别的都缓存,本例中就是只缓存 detail 组件
<keep-alive exclude="home,about" >
    <router-view></router-view>
</keep-alive>

以 include=”about,detail” 为例的效果图

语法的意思是,只缓存 about 和 detail,别的组件不缓存。咱们看下图的 vue 工具,也能够看进去,缓存的组件,不处于对应展现的路由下,就会成为 inactive 状态。

keep-alive 除了 include 和 exclude 属性之外,还有一个属性就是 max 属性,这个 max 个别状况用的不是太多,次要目标就是管制一下被缓存的组件的个数,后缓存的就会把先缓存的给挤掉线了,也是相当于缓存优化的一中策略了。毕竟适当缓存进步用户体验,缓存过渡,电脑变卡。

include 和 exclude 的属性值是组件的名称

include 和 exclude 的属性值是组件的名称,也就是组件的 name 属性值,也就是如下的 name 属性值。

<script>
    export default {
      name: "App"
      // ...
    };
</script>

引出问题

咱们晓得组件中都有对应的逻辑 js 局部,而且组件要发申请获取数据的,个别状况下,咱们都是在 created 或者 mounted 钩子中去发申请,向后端的大佬要数据的,对于应用 keep-alive 后的组件的钩子函数的问题,咱们须要留神一下

应用 keep-alive 的钩子函数执行程序问题

首先应用了 keep-alive 的组件当前,组件上就会主动加上了 activated 钩子和 deactivated 钩子。

  • activated 当组件被激活(应用)的时候触发 能够简略了解为进入这个页面的时候触发
  • deactivated 当组件不被应用(inactive 状态)的时候触发 能够简略了解为来到这个页面的时候触发

进入组件和来到组件钩子执行程序

假如咱们只缓存 home 组件,咱们先看一下代码,再在钩子中打印出对应的程序。就晓得钩子执行的程序了,本人入手印象粗浅

  • 代码如下

    <template>
    <div>
      <el-checkbox v-model="checked"> 备选项 </el-checkbox>
    </div>
    </template>
    <script>
    export default {
    name: "home",
    data() { return { checked: false} },
    created() {console.log("我是 created 钩子");
    },
    mounted() {console.log("我是 mounted 钩子");
    },
    activated() {console.log("我是 activated 钩子");
    },
    deactivated() {console.log("我是 deactivated 钩子");
    },
    beforeDestroy() {console.log("我是 beforeDestroy 钩子"); 所以咱们能够得出结论:},
    };
    </script>
  • 进入组件打印后果如下

    我是 created 钩子
    我是 mounted 钩子
    我是 activated 钩子
  • 来到组件打印后果如下
    我是 deactivated 钩子
  • 得出结论

    初始进入和来到 created ---> mounted ---> activated --> deactivated
    后续进入和来到 activated --> deactivated

所以咱们能够在 activated 和 deactivated 钩子中去做一些逻辑解决,这两个钩子有点相似 mounted 和 beforeDestroy 钩子,然而还是不一样。毕竟应用 keep-alive 不会销毁组件

keep-alive 的利用场景举例

  • 查看表格某条数据详情页,返回还是之前的状态,比方还是之前的筛选后果,还是之前的页数等
  • 填写的表单的内容路由跳转返回还在,比方 input 框、下抉择拉框、开关切换等用户输出了一大把货色,跳转再回来不能清空啊,不能让用户再写一遍啊,是吧老铁
  • 反正就是保留之前的状态,具体利用场景其实也有很多,在此不赘述 …

补充

上述咱们应用的是 keep-alive 包裹 router-view 的小案例来解说的,实际上 keep-alive 个别状况下,要么包裹 router-view,要么包裹动静组件 component。代码写法实际上是一样的。包裹动静组件的用法如下:

<keep-alive include="home" exclude="about">
     <component :is="whichComponent"></component>
</keep-alive>

keep-alive 的 include 和 exclude 属性也反对 v -bind 的语法,所以也是很灵便的。

正文完
 0