该学会用KeepAlive了宝!

浅聊一下

在我们的项目中,时常会碰到组件切换的问题,从A组件切换到B组件,会经历渲染和销毁等阶段,当我们重新切换回A组件时,又要重新挂载,由此观之,这个过程会经历多次重新渲染和组件销毁,消耗性能。那么我们今天要聊的就是如何来缓存我们的组件,使其不被销毁...

KeepAlive

首先请出我们的老朋友,首页和关于先生


我将使用这两个组件来向大家演示如何进行组件缓存...来到App.vue,使用以下方法,将router-view包裹起来

js 复制代码
<template>
  <div>
    <nav>
      <router-link to="/">首页|</router-link>
      <router-link to="/about">关于</router-link>
    </nav>
    <router-view v-slot="{ Component }">
      <keep-alive :include="['Home']">
        <component :is="Component" />
      </keep-alive>
    </router-view>
  </div>
</template>

这里使用到了v-slot插槽,通过 v-slot 指令,我们可以访问到 <router-view> 的默认插槽,并将插槽内容赋值给变量 Component。然后我们在:include中添加自己想要缓存的组件,我们这里只添加Home组件来与About组件形成对比。

那么,我们怎么才能知道Home页面是否缓存了呢?那就不得不提到KeepAlive的两个生命周期钩子activateddeactivated

activated 和 deactivated

activated 是 Vue Router 提供的一个生命周期钩子函数,用于在路由组件被激活时执行相应的逻辑。当路由切换到某个组件时,如果该组件之前已经被渲染过(通过 <keep-alive> 缓存),那么在组件被再次激活时,activated 钩子函数会被调用(第一次挂载也会调用)。

deactivated用于在路由组件被停用时执行相应的逻辑。当路由从某个组件切换到其他组件时,如果该组件之前已经被渲染过(通过 <keep-alive> 缓存),那么在组件被停用时,deactivated 钩子函数会被调用。

需要注意的是,不论是activated还是deactivated,只有在组件被KeepAlive缓存起来,activateddeactivated才会存在...

接下来,我们来演示一下activated,分别给Home和About加上如下代码,记录一下组件挂载和卸载

js 复制代码
onMounted(()=>{
    console.log('Home mounted');
})
onUnmounted(()=>{//当组件被卸载时触发
    console.log('Home unmounted');
})
onMounted(()=>{
    console.log('About mounted');
})
onUnmounted(()=>{
    console.log('About unmounted');
})

来到首页

此刻,Home组件被挂载,打印 Home mountedHome activated(在第一次挂载时也会调用activated)

点击去到关于

此时,Home组件停用,触发 deactivated,About页面挂载,打印Home deactivatedAbout mounted ,并且,这个过程中没有触发Home组件的onUnMounted生命周期钩子

回到首页

回到首页,触发activated生命周期钩子,并且About组件触发了onUnmounted生命周期钩子

通过以上的对比,我相信KeepAlive和他的生命周期钩子你就已经全部理解了,那么你还需要了解的就是他们的使用场景。

使用场景

activateddeactivated 钩子函数都是用于处理页面组件在路由切换过程中的生命周期事件,它们可以用于一些特定的场景,下面是它们的主要使用场景:

  1. 数据加载和清理

    • activated 可以用来在组件被激活时加载数据,比如发送网络请求获取数据。
    • deactivated 可以用来在组件被停用时清理数据,比如取消网络请求、清除定时器或清理临时状态。
  2. 页面状态保存和恢复

    • 通过 activateddeactivated 可以在组件被激活和停用时保存和恢复页面的状态,例如滚动位置、表单输入内容等。
  3. 性能优化

    • 使用 activated 可以在组件激活时做一些性能优化的操作,例如懒加载图片或其他资源。
    • 使用 deactivated 可以在组件停用时释放一些资源,以减少内存占用。
  4. 监控和日志记录

    • 可以利用 activateddeactivated 来监控页面组件的激活和停用情况,并记录日志信息。

总之,activateddeactivated 钩子函数可以帮助你在页面组件生命周期中进行更精细的控制,从而实现数据管理、页面状态管理、性能优化和监控日志等方面的需求。

结尾

在实际开发中,我们可以根据具体情况选择是否使用KeepAlive来缓存组件。一般来说,如果页面数据比较复杂或者需要频繁切换的组件,使用KeepAlive会有更好的用户体验和性能表现。

但是需要注意的是,由于KeepAlive会缓存组件,所以可能会带来一些副作用,比如组件状态不同步、内存占用过高等问题。因此,在使用KeepAlive时,需要仔细考虑缓存策略,避免出现意料之外的问题。

相关推荐
真的很上进7 分钟前
如何借助 Babel+TS+ESLint 构建现代 JS 工程环境?
java·前端·javascript·css·react.js·vue·html
web1309332039813 分钟前
vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法
前端·vue.js·elementui
NiNg_1_23434 分钟前
Echarts连接数据库,实时绘制图表详解
前端·数据库·echarts
测试老哥42 分钟前
外包干了两年,技术退步明显。。。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
如若1231 小时前
对文件内的文件名生成目录,方便查阅
java·前端·python
滚雪球~2 小时前
npm error code ETIMEDOUT
前端·npm·node.js
沙漏无语2 小时前
npm : 无法加载文件 D:\Nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本
前端·npm·node.js
supermapsupport2 小时前
iClient3D for Cesium在Vue中快速实现场景卷帘
前端·vue.js·3d·cesium·supermap
brrdg_sefg2 小时前
WEB 漏洞 - 文件包含漏洞深度解析
前端·网络·安全
胡西风_foxww2 小时前
【es6复习笔记】rest参数(7)
前端·笔记·es6·参数·rest