🚀高效使用组件缓存解决实际应用场景

本文比较偏向业务场景,平时大家都是面向业务编程,我觉得多一些这样的分享可能对刚入门的小伙伴比较有用。只是一个在工作中发现的多页面切换没有达到预期缓存的效果的需求,所以当成一个分享。

什么是keepalive

<keep-alive> 是一个内置的抽象组件,它用于缓存动态组件,以便在组件之间切换时保留组件的状态,而不需要每次都重新创建和销毁组件。这对于提高性能和用户体验非常有用,特别是在处理大型单页应用(SPA)或具有多个视图的应用时。

keepalive的作用

<keep-alive> 组件通常包裹动态组件,例如路由视图组件,以确保这些组件在切换时被缓存,而不会被销毁。它有两个主要用途:

  1. 缓存组件状态 :当你使用<keep-alive> 包裹一个组件时,该组件的状态(数据、DOM状态等)将被保留。当你再次切换到该组件时,它将恢复到之前的状态,而不是重新渲染和初始化。这对于避免不必要的数据加载和渲染很有帮助,从而提高性能。
  2. 节省资源 :由于组件的状态被保留,而不是销毁,<keep-alive> 可以减少内存和资源的开销。这对于具有多个页面或视图的应用,特别是在移动应用中,非常重要。

举个栗子

如图是工作的时候项目组提出的需求,我们可以看到在切换tab菜单的时候,上一个菜单页面所填写的筛选信息,当切换到另一个页面再切换回去的时候,就会由于页面没有缓存,而重新加载了页面,那么则会出现两个问题,也是业务场景中最常见的两个问题。

1.用户想切换到另一个页面查看详情,返回的时候筛选条件被清空,又要重新筛选

2.页面的节点较多,(我们这个系统的单筛选框就已经十几二十个,并且按钮等新增修改流转事件也有十几二十个), 页面加载的比较慢,所以每次切换tab标签的时候就会多一段等待的时间。

解决方案

切换tab,筛选框中的值会变重置,希望达到的效果是切换回tab的时候保存筛选条件

js 复制代码
//上方tabs栏
<transition name="fade-quick">
    <i-tabs v-if="tabs" v-show="showHeader" @on-reload="handleReload" />
</transition>
//下方路由内容区
<div class="i-layout-content-main" style="margin-bottom:-0px">
    <keep-alive >
        <router-view  />
    </keep-alive>
</div>

给routerview加上keepalive,keepalive的包括空间是tabs下面的内容,目的是为了将下面的页面进行一个缓存,这样切换页面的时候筛选框的内容不会被清除,keepalive主要就是对roterview的路由来进行一个缓存

  • <keep-alive> 是Vue.js提供的组件,用于缓存动态组件。它可以包裹一个组件,以便在组件之间切换时保留组件的状态,而不用每次都重新创建和销毁组件。
  • <router-view> 是用于呈现当前路由对应组件的Vue Router组件。在这段代码中,<router-view> 被包装在 <keep-alive> 中,这意味着路由视图的组件会在切换路由时被缓存,以提高性能和用户体验。

所以,这段代码的作用是在加载路由视图时使用 <keep-alive> 缓存组件状态。

方案展示

下面是缓存后的结果,可以看到切换到另一个路由再切换回来,由于keepalive的缓存组件功能,上一个路由的筛选条件仍然能够保留下来。

方案进阶

合理利用includes

  1. 灵活性 :在一些复杂的应用中,我们可能只想缓存其中的一部分组件,而不是全部。通过使用 includes,可以精确地控制哪些组件被缓存,哪些不被缓存。
  2. 性能:缓存所有的组件可能会占用较多的内存,特别是在大型应用中。通过只缓存那些真正需要的组件,可以减少内存消耗,提高性能。
  3. 避免意外缓存:某些组件不适合被缓存,比如某些编辑修改实时刷新的页面。
js 复制代码
<div class="i-layout-content-main" style="margin-bottom:-0px">
    <keep-alive :include="keepAliveList">
        <router-view v-if="loadRouter" />
    </keep-alive>
</div>

keepAliveList包含了一些需要被缓存到的组件,写法大概是这样的

js 复制代码
<keep-alive :include="['ComponentA', 'ComponentB']"> <router-view /> </keep-alive>

🙏 感谢您花时间阅读这篇文章!如果觉得有趣或有收获,请关注我的更新,给个喜欢和分享。您的支持是我写作的最大动力!

往期好文推荐

相关推荐
kingwebo'sZone3 分钟前
ASP.net WebAPI 上传图片实例(保存显示随机文件名)
后端·asp.net
桑榆肖物3 分钟前
一个简单的ASP.NET 一致性返回工具库
后端·asp.net
组态软件3 小时前
web组态软件
前端·后端·物联网·编辑器·html
Peter_chq3 小时前
【计算机网络】多路转接之select
linux·c语言·开发语言·网络·c++·后端·select
前端Hardy3 小时前
HTML&CSS:MacBook Air 3D 动画跃然屏上
前端·javascript·css·3d·html
cnsxjean6 小时前
SpringBoot集成Minio实现上传凭证、分片上传、秒传和断点续传
java·前端·spring boot·分布式·后端·中间件·架构
ZL_5676 小时前
uniapp中使用uni-forms实现表单管理,验证表单
前端·javascript·uni-app
kingbal7 小时前
SpringCloud:Injection of resource dependencies failed
后端·spring·spring cloud
沉浮yu大海7 小时前
Vue.js 组件开发:构建可重用且高效的 UI 块
前端·vue.js·ui
代码欢乐豆7 小时前
软件工程第13章小测
服务器·前端·数据库·软件工程