位置: 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)(德国楚格峰一日游攻略)

  • 进项税额转出怎么操作
  • 建筑公司分包项目违法吗
  • 增值税发票抵扣是什么意思
  • 物业费的税金是否向业主收取
  • 增值税附加税有没有滞纳金
  • 终止经营的会计处理
  • 计税依据的定义
  • 印花税核定征收管理办法
  • 会计核算过程中的错误分析
  • 冲减往年管理费用
  • 个体工商户不经营会自动注销吗
  • 总分包外地施工怎样预缴税款?
  • 付款方式公对公什么意思
  • 企业收入进私户怎么做账
  • 租赁房产不开租房发票
  • 混凝土增值税政策
  • 年终奖怎么缴纳个税
  • 金税盘开的发票显示未报送怎么办
  • 固定资产折旧计提完毕怎么处理
  • 无形资产怎么核算成本
  • 固定资产盘亏盘盈账务处理
  • 有留抵怎么交增值税
  • 去年多确认收入今年怎么调整
  • 出口退税系统中的出口货物已补税未退税证明怎么填
  • 薪酬支出包括什么
  • 个人出租住房需要交城镇土地使用税吗
  • vc_runtimeMinimum_x64.msi 找不到的解决方法
  • 研发费用属于期余资产吗
  • 费用票可以抵扣什么税
  • 往来账乱如何处理
  • windows10闹钟不响
  • win7右键设置方法
  • 房产税的会计科目怎么做
  • 外资企业股权转让给外资企业
  • 企业购入固定资产在每期末应使用公允价值法进行计量
  • 刷票系统能看出来吗
  • 员工补偿金分录
  • 企业内部研究开发项目开发阶段的支出
  • Vue3 + Vite + TypeScript + dataV 打造可视化大屏
  • 废旧物资发票抵扣
  • 政府购买企业服务是否交税
  • 基建费用如何摊销
  • 发票已开,款未到的会计分录
  • vue结合elementui
  • 利息资本化怎么计算
  • php单例模式连接数据库
  • 交所得税会计分录例题
  • 物业公司收的水费是计入其他应付款还是其他业务收入
  • 预收账款是否要缴纳增值税
  • 预缴城建税税率
  • 营改增后房地产企业增值税如何核算
  • SQL查询数据库中表的某一列
  • 印花税计税依据怎么算
  • 跨月发票红冲怎么做账务处理
  • 怎样在excel计算
  • 应付职工薪酬代扣社保
  • 营改增适用范围
  • 顺风车没有发票是否合法
  • win7 bug
  • 资源管理器操作教程
  • windows2003 IIS6.0 asp配置技巧
  • win8系统没有声音
  • archlinux安装zsh
  • win8点击桌面没反应
  • winxp如何删除网卡驱动
  • ubuntu安装chia
  • window10窗口操作
  • ramaint.exe - ramaint是什么进程 有什么用
  • centos如何操作
  • win7的系统
  • windows7笔记本无线网络连接
  • win10系统网络连接配置异常
  • linux程序打包和安装
  • android遇到的难题
  • js函数总结
  • python 元类的作用
  • 高速通行费发票查验
  • 增值税抵扣联怎么装订
  • 广西纳税申报流程
  • 各地税务机关
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设