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

  • 小米呼叫限制解除方法(小米呼叫限制解决方法)

    小米呼叫限制解除方法(小米呼叫限制解决方法)

  • 微信腾讯服务怎样删除(微信腾讯服务怎么删除)

    微信腾讯服务怎样删除(微信腾讯服务怎么删除)

  • 苹果手机a1699是几寸的(苹果手机a1699是那年出厂的)

    苹果手机a1699是几寸的(苹果手机a1699是那年出厂的)

  • 库乐队无法打开乐曲(库乐队无法打开乐曲需要更高版本)

    库乐队无法打开乐曲(库乐队无法打开乐曲需要更高版本)

  • 电脑登微信说版本过低(电脑登录微信说版本过低怎么回事)

    电脑登微信说版本过低(电脑登录微信说版本过低怎么回事)

  • 淘宝如何修改年龄(淘宝怎样修改年龄)

    淘宝如何修改年龄(淘宝怎样修改年龄)

  • 抖音是什么时候出来的(抖音是什么时候推出的)

    抖音是什么时候出来的(抖音是什么时候推出的)

  • word版是什么意思(word是什么意思计算机)

    word版是什么意思(word是什么意思计算机)

  • 抖音直播可以放电影吗(抖音直播可以放电视剧吗)

    抖音直播可以放电影吗(抖音直播可以放电视剧吗)

  • vc/a是苹果哪个国家版本(vc是什么版本的苹果)

    vc/a是苹果哪个国家版本(vc是什么版本的苹果)

  • qq vip能干什么(qq vip有什么作用)

    qq vip能干什么(qq vip有什么作用)

  • 微信朋友圈一条杠是删了还是屏蔽了(微信朋友圈一条线是不是已经被删除)

    微信朋友圈一条杠是删了还是屏蔽了(微信朋友圈一条线是不是已经被删除)

  • 小米6充电没反应(小米充电没反应又开不了机怎么办)

    小米6充电没反应(小米充电没反应又开不了机怎么办)

  • ipad2用久了很卡怎么办 (ipad用了两年变卡了)

    ipad2用久了很卡怎么办 (ipad用了两年变卡了)

  • oppo手机相机九宫格怎么设置(oppo手机相机九宫格在哪里)

    oppo手机相机九宫格怎么设置(oppo手机相机九宫格在哪里)

  • 高通骁龙710和712有什么区别(高通骁龙710和660处理器哪个好)

    高通骁龙710和712有什么区别(高通骁龙710和660处理器哪个好)

  • 怎样用cad导出jpg格式的图片(cad如何导出jpg格式)

    怎样用cad导出jpg格式的图片(cad如何导出jpg格式)

  • 手机谷歌浏览器怎么改中文(手机谷歌浏览器用什么加速器能打开)

    手机谷歌浏览器怎么改中文(手机谷歌浏览器用什么加速器能打开)

  • iphone顶部状态栏设置(iphone顶部状态栏不见了怎么恢复)

    iphone顶部状态栏设置(iphone顶部状态栏不见了怎么恢复)

  • iphone7摄像头附近发烫(iphone7p摄像头)

    iphone7摄像头附近发烫(iphone7p摄像头)

  • 乐视视频如何投屏(乐视视频如何投屏到电视上)

    乐视视频如何投屏(乐视视频如何投屏到电视上)

  • apple store可以用花呗吗(apple store可以用支付宝亲密付吗)

    apple store可以用花呗吗(apple store可以用支付宝亲密付吗)

  • Ichetucknee河的海牛,佛罗里达州 (© Jennifer Adler/Alamy)

    Ichetucknee河的海牛,佛罗里达州 (© Jennifer Adler/Alamy)

  • window下,cuda版本和NVIDIA驱动版本关系,cuda版本 和 TensorFlow-GPU版本关系,TensorFlow-GPU安装(window cuda)

    window下,cuda版本和NVIDIA驱动版本关系,cuda版本 和 TensorFlow-GPU版本关系,TensorFlow-GPU安装(window cuda)

  • 代扣个人所得税怎么算
  • 个人去税务局开专票需要提供什么
  • 四大税种是什么
  • 企业间无偿划转资产,非关联方经营
  • 税金及附加会计分录
  • 公司注册认缴和实缴的区别
  • 劳务发票可以抵扣多少
  • 个税申报表中的基本养老保险怎么填
  • 外销客户付的模具费如何入账
  • 附加税扣款比例
  • 发票遗失如何报销
  • 以前年度成本多入了怎样调整
  • 一般纳税人外地预缴增值税税率
  • 自然人独资企业是什么意思
  • 预算管理的方法及应用
  • 增值税退税什么时候办理
  • 老板投资的钱怎么入账
  • 设备投入安装计入什么科目
  • 原来已入帐的款现在收回帐务处理?
  • 个体工商户给员工交社保流程
  • 小规模专票冲红怎么操作
  • 即用于一般计税又用于简易计税的固定资产抵扣
  • 一般纳税人所得税优惠政策
  • 关联关系的判定标准
  • 企业所得税是按季度还是按月
  • 兼职获得员工旅游资源
  • 代收国税地税收入
  • 分公司可以再开分公司吗
  • 对外工程承包企业
  • 多计提教育费附加怎么调整
  • 长期待摊费用提前清理
  • 工资计提如何做账
  • 购货方跨月销项负数发票如何做账?
  • 税务稽查补缴增值税税款的账务处理
  • i9 9900ks什么意思
  • 税控盘减免税款结转会计分录
  • php file_get_contents 读取图片
  • 销售旧设备如何开票
  • php现在
  • 应付债券的会计分录有哪些
  • php composer自动加载
  • 接受捐赠会计准则
  • 塔菲尔区域
  • 伊兰简介
  • 企业所得税季初数怎么填
  • 爱丽丝小镇在哪
  • 工具合集
  • 红外图像识别算法
  • php中split
  • 以股权换股权税务问题
  • 已经红冲的发票显示正常
  • 前年度多交附加税怎么交
  • 织梦百科
  • 数据库生成随机数函数
  • mysql存储语句
  • 收到预付款发票但是货未到怎么办
  • 停产期间发生的事故
  • 意外伤害条件
  • 一般企业报税的税种
  • 食堂没发票如何记账
  • 账户与会计科目有什么联系与区别?
  • sql语句实现分页
  • vmware虚拟机步骤
  • 清华同方bios通用密码(thtfpc)
  • Win7旗舰版系统安装
  • 金山卫士电脑版
  • wfxswtch.exe - wfxswtch是什么进程
  • ubuntu装eclipse
  • ic_launcher.xml
  • windows 8/10whql
  • Win10预览版镜像
  • 自动重启服务脚本
  • javascript如何学
  • unity3drpg游戏
  • 税务稽查协查管理办法 国家税务总局
  • 延安市地方税务局电话
  • 随申办如何缴纳社保
  • 税务系统电子发票的详细步骤
  • 虚假纳税申报的法律责任
  • 园区地税局在哪里
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设