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

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

什么是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>

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

往期好文推荐

相关推荐
paopaokaka_luck11 分钟前
基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
前端·javascript·vue.js·spring boot·后端·小程序·uni-app
Villiam_AY14 分钟前
Redis 缓存机制详解:原理、问题与最佳实践
开发语言·redis·后端
患得患失94944 分钟前
【前端】【vscode】【.vscode/settings.json】为单个项目配置自动格式化和开发环境
前端·vscode·json
飛_1 小时前
解决VSCode无法加载Json架构问题
java·服务器·前端
YGY Webgis糕手之路3 小时前
OpenLayers 综合案例-轨迹回放
前端·经验分享·笔记·vue·web
魔尔助理顾问4 小时前
系统整理Python的循环语句和常用方法
开发语言·后端·python
90后的晨仔4 小时前
🚨XSS 攻击全解:什么是跨站脚本攻击?前端如何防御?
前端·vue.js
Ares-Wang4 小时前
JavaScript》》JS》 Var、Let、Const 大总结
开发语言·前端·javascript
90后的晨仔4 小时前
Vue 模板语法完全指南:从插值表达式到动态指令,彻底搞懂 Vue 模板语言
前端·vue.js
程序视点4 小时前
Java BigDecimal详解:小数精确计算、使用方法与常见问题解决方案
java·后端