位置: 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 11怎么用
  • linux版笔记本什么意思
  • win10系统关机后自动开机怎么办
  • php自动下载文件到本地
  • PHP:session_unset()的用法_Session函数
  • 以公允价值计量的投资性房地产
  • php jsondecode
  • 政府划入资产会计处理
  • vue默认首页
  • php随机数组
  • 企业经营状态有哪几种
  • 计算机视觉需要学什么
  • 毕业设计基础
  • nstat命令 监视内核的SNMP计数器和网络接口状态
  • 软件开发增值税减免政策
  • php网站用什么软件修改
  • mysql全局锁和表锁
  • 装修费入账科目
  • 银行贷款入账需要什么
  • 专用发票货物名称开错可以吗
  • 公司新增注册资本是认缴的吗
  • 一般纳税人之间转让土地使用权交哪些税金
  • 残保金 滞纳金
  • 金蝶k3费用发票怎么生成凭证
  • 现金流量表中的现金流量包括哪些
  • 税法中对差旅费的处理
  • 汽车维修公司做账基本流程
  • 劳务公司账务处理实例
  • 稳岗返还的概念
  • 如何把有余额的账单删除
  • 建筑劳务公司的会计账务处理
  • 实收资本后面带人名吗
  • 购买原材料还没发票
  • 固定资产大修理支出摊销年限
  • 普票丢失可以用复印件入账吗
  • 律师费能计入办公费吗合法吗
  • 用于研发购买的材料进项税额
  • 生产成本是直接成本吗
  • 虚拟机中安装虚拟机
  • xp系统百度
  • centos8 bond0
  • docker mysql 数据存储容器目录
  • win8怎么设置开机启动项
  • winxp如何修改密码
  • windows7能玩地下城吗
  • win7自带截图工具
  • 如何自定义win键
  • linux中使用find命令查找文件
  • 使用jquery
  • jQuery+Ajax实现无刷新分页
  • node. js教程
  • 虚拟内存系统盘
  • perl中sub
  • Begin OpenGL with Python-1st Day,draw a simple sample.
  • css设置段落
  • unity3d asset store
  • android动态添加view
  • 各种手机ui大全
  • 重庆电子税务局网页版登录
  • 企业欠税补交后影响贷款吗
  • 中国宗教协会如何注册?
  • 婚姻登记处婚俗改革宣传
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设