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

  • 税前扣除凭证按照用途分为哪些
  • 工程结算时如何确认收入
  • 个人独资企业需要交什么税
  • 对公收到一分钱怎么做账
  • 利息支出可以抵扣吗
  • 网线的税收编码是多少
  • 公司兼职的工资怎么发
  • 塔吊基础属于哪一类
  • 销售商品收到银行汇票计入什么科目
  • 无形资产摊销和累计摊销一样吗
  • 子女教育专项附加扣除是什么意思
  • 应收票据的会计分录例题
  • 房屋出租收入其税收如何计算呢?
  • 报销购物卡发票公司如何交税?
  • 仓库的数量为负数怎么办
  • 两免三减半政策适用哪些企业
  • 印花税计提会计分录
  • 其他应付款怎么理解
  • 如何查询企业开票记录
  • 领用原材料安装固定资产
  • 基建拨款账务处理
  • 无票收入后附什么凭证
  • 税收分类编码选错会怎样
  • 腾讯电脑管家中蓝牙在哪
  • 分配利润给股东怎么做分录
  • php压缩包
  • php程序员不应该做的事
  • linux中使用less命令分屏查看
  • 补交以前年度的城建税会计分录
  • 经营出租设备属于什么科目
  • 借条和欠条的区别 法律效力
  • php数组函数 菜鸟
  • php封装接口
  • sonar-scanner需要配置环境变量
  • thinkphp5上传图片
  • 如何用php操作mysql
  • echarts series name
  • 计算机视觉的应用
  • 营业税金及附加税率
  • 汇算清缴所得税是什么意思
  • 营业收入为什么不包括营业外收入
  • 典当公司收到房款怎么办
  • 计提本月工资社保怎么扣
  • 销售返利的账务处理购买方
  • 工程服务预付款最新规定
  • 劳务派遣工资是死的吗
  • 公司给部分员工长期停工怎么办
  • 增值税专用发票几个点
  • 用sql语言
  • 数据库varchar和nvarchar
  • 什么叫挂往来
  • 金税四期是什么意思
  • 计提折旧会计分录怎么做
  • 诉讼期间的利息法院支不支持
  • 认缴制不会带来的账务问题
  • 道路交通事故中施救费应如何处理?
  • 一年内到期的非流动负债是经营性负债吗
  • 存货周转次数越高好还是越低好
  • 用友u8怎样查询上个月凭证
  • 企业买车购置税可以抵增值税吗
  • 其他商业项目
  • Select count(*)、Count(1)和Count(列)的区别及执行方式
  • windos桌面
  • centos7installation怎么配
  • 电脑提示Windows照片查看器无法打开此图片
  • win7系统自带游戏在哪
  • 如何清除Windows登录记录
  • win10系统局域网共享打印机设置
  • linux mkdir函数创建多级目录
  • win10更新后qq打不开
  • Win7系统电脑开不开机怎么办
  • win7运行窗口在哪
  • 菜单下一章
  • nodejs child_process
  • 如何编写一个完整的教学目标
  • javascript简述
  • JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
  • 蚌埠城乡医保缴费查询
  • 电子税务局无法导出申报表
  • 北京市印花税减免政策
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设