位置: IT常识 - 正文

React中实现keepalive组件缓存效果(react keepalive)

编辑:rootadmin
React中实现keepalive组件缓存效果

推荐整理分享React中实现keepalive组件缓存效果(react keepalive),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:react-keep-alive,react keep-alive,react keycloak,react-keep-alive,react keeplive,react-keep-alive,react keep,react keep,内容如对您有帮助,希望把文章链接给更多的朋友!

背景:由于react官方并没有提供缓存组件相关的api(类似vue中的keepalive),在某些场景,会使得页面交互性变的很差,比如在有搜索条件的表格页面,点击某一条数据跳转到详情页面,再返回表格页面,会重新请求数据,搜索条件也将清空,用户得重新输入搜索条件,再次请求数据,大大降低办公效率,如图:

目标:封装keepalive缓存组件,实现组件的缓存,并暴露相关方法,可以手动清除缓存。

React中实现keepalive组件缓存效果(react keepalive)

版本:React 17,react-router-dom 5

结构:

代码:

cache-types.js

// 缓存状态export const CREATE = 'CREATE'; // 创建export const CREATED = 'CREATED'; // 创建成功export const ACTIVE = 'ACTIVE'; // 激活export const DESTROY = 'DESTROY'; // 销毁

 CacheContext.js

import React from 'react';const CacheContext = React.createContext();export default CacheContext;

cacheReducer.js

import * as cacheTypes from "./cache-types";function cacheReducer(cacheStates = {}, { type, payload }) { switch (type) { case cacheTypes.CREATE: return { ...cacheStates, [payload.cacheId]: { scrolls: {}, // 缓存滚动条,key: dom, value: scrollTop cacheId: payload.cacheId, // 缓存Id element: payload.element, // 需要渲染的虚拟DOM doms: undefined, // 当前的虚拟dom所对应的真实dom status: cacheTypes.CREATE,// 缓存状态 }, }; case cacheTypes.CREATED: return { ...cacheStates, [payload.cacheId]: { ...cacheStates[payload.cacheId], doms: payload.doms, status: cacheTypes.CREATED, }, }; case cacheTypes.ACTIVE: return { ...cacheStates, [payload.cacheId]: { ...cacheStates[payload.cacheId], status: cacheTypes.ACTIVE, }, }; case cacheTypes.DESTROY: return { ...cacheStates, [payload.cacheId]: { ...cacheStates[payload.cacheId], status: cacheTypes.DESTROY, }, }; default: return cacheStates; }}export default cacheReducer;

KeepAliveProvider.js

import React, { useReducer, useCallback } from "react";import CacheContext from "./CacheContext";import cacheReducer from "./cacheReducer";import * as cacheTypes from "./cache-types";function KeepAliveProvider(props) { let [cacheStates, dispatch] = useReducer(cacheReducer, {}); const mount = useCallback( ({ cacheId, element }) => { // 挂载元素方法,提供子组件调用挂载元素 if (cacheStates[cacheId]) { let cacheState = cacheStates[cacheId]; if (cacheState.status === cacheTypes.DESTROY) { let doms = cacheState.doms; doms.forEach((dom) => dom.parentNode.removeChild(dom)); dispatch({ type: cacheTypes.CREATE, payload: { cacheId, element } }); // 创建缓存 } } else { dispatch({ type: cacheTypes.CREATE, payload: { cacheId, element } }); // 创建缓存 } }, [cacheStates] ); let handleScroll = useCallback( // 缓存滚动条 (cacheId, { target }) => { if (cacheStates[cacheId]) { let scrolls = cacheStates[cacheId].scrolls; scrolls[target] = target.scrollTop; } }, [cacheStates] ); return ( <CacheContext.Provider value={{ mount, cacheStates, dispatch, handleScroll }} > {props.children} {/* cacheStates维护所有缓存信息, dispatch派发修改缓存状态*/} {Object.values(cacheStates) .filter((cacheState) => cacheState.status !== cacheTypes.DESTROY) .map(({ cacheId, element }) => ( <div id={`cache_${cacheId}`} key={cacheId} // 原生div中
本文链接地址:https://www.jiuchutong.com/zhishi/293062.html 转载请保留说明!

上一篇:训练自己的GPT2模型(中文),踩坑与经验(训练自己的GPT模型 中文改英文)

下一篇:楚格峰山顶的缆车站,德国格赖瑙市 (© Robert Jank/Alamy)(德国楚格峰一日游攻略)

  • 固定资产进项税的账务处理
  • 企业借出去的钱收不回来
  • 没有审计报告的上市公司怎么办
  • 房产税与土地使用税如何申报
  • 小规模纳税人零申报是每季度报吗
  • 会计差错更正流程
  • 投标函中的其他是指什么
  • 母公司对子公司的债务承担连带责任
  • 存货清查的目的,主要是进行总账和明细账
  • 年末本年利润结转未分配利润
  • 城建税及教育附加税怎么算
  • 增值税即征即退政策
  • 公司获得投资
  • 小规模纳税人注销流程及费用
  • 每月收到融资租赁费利息发票
  • 金融机构可以采取什么措施
  • 企业进行破产清算时,适用于账面价值与实际价值
  • 教培机构房租占比
  • 试用期内进一步使用
  • 民间非营利组织会计制度最新版
  • 股东投入的资金可以计入资本公积吗
  • windows 10鼠标如何操作
  • linux系统怎么安装网卡驱动
  • 微信打开链接无法滑动
  • 如何在没有开瓶器的情况下开红酒
  • 王者荣耀中太乙真人的技能有哪些?
  • 月末是指
  • 赔绿化损失费的法律依据
  • php实现基数排序函数
  • 苹果电脑隐藏软件功能怎么开启
  • win10一直显示修复
  • win11正式版问题
  • 换购商品分录怎么做
  • 点云目标检测数据集
  • php_fileinfo作用
  • 长期债券投资减少是计入贷方吗?
  • 契税计税依据是成交价还是评估价?
  • 代理金融业务
  • 低值易耗品的三级科目有哪些
  • 建筑服务需要开外经证吗
  • 九斑蛾,瑞士 (© Thomas Marent/Minden Pictures)
  • 静态显示方式
  • php读取二进制文件
  • 既简单又安全的小实验
  • IntersectionObserver 翻译
  • tomcat服务器在哪个位置
  • controller控制器怎么调
  • 出售自建不动产怎么交税
  • 增值税发票打印出格了能用吗
  • 完税价格和实际价格
  • 定期定额自行申报表
  • 在途资金属于什么科目
  • 公司收到拆迁补偿金,于评估公司的区别
  • 行政机关现金管理办法
  • 税局代开的专票能作废或红冲吗?
  • 未开票收入怎么做账
  • 如何计算债券实际收益
  • 年末出现打一数字
  • mysql 5.7.32
  • win7系统如何重新分区
  • w8远程桌面连接
  • 电脑开机显示xp后无反应
  • winxp启动
  • Ubuntu安装ssh
  • Mac系统怎么设置开机密码
  • win7 64位系统安装绘声绘影8提示已安装另一个版本的解决方法
  • windows中的服务
  • win7系统硬盘
  • win10如何快速打开设置
  • win10远程桌面连接教程
  • linux配置静态
  • webpack使用ejs
  • android基于什么语言
  • opengl使用教程
  • 会用python
  • shell脚本输出空格
  • 京东发票税号是几位数
  • 境外付款需要什么手续
  • 江西省国家税务局总局官网
  • 民族贸易产生的原因
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设