码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • react实现keepAlive 可手动清除缓存的


     vue自带keepAlive功能这个大家都知道,但是如果是react呢?

     react功能特别单一的,只维护视图和数据渲染同步部分,其余的依赖三方包。

    今天讲的内容与第三方包reat-activation有关

     封装

    1. import React, { useEffect } from 'react';
    2. import KeepAlive, { useAliveController } from 'react-activation';
    3. import type { FC } from 'react';
    4. interface Iprops {
    5. name: string;
    6. }
    7. const ChildDemo: FC<Iprops> = props => {
    8. const keepAliveKey = props.name;
    9. if (!keepAliveKey) {
    10. console.error('keepAlive 包装组件 的key不能为空');
    11. }
    12. const { dropScope } = useAliveController();
    13. // 关闭页签时清空缓存
    14. const clearCache = (e: any) => {
    15. console.log('关闭tab', e?.data?.deleteTab, keepAliveKey);
    16. if (e?.data?.deleteTab === keepAliveKey) {
    17. dropScope(keepAliveKey);
    18. }
    19. };
    20. //接受关闭当前页面的事件,这是特定项目的事件,请根据自己的项目来处理
    21. useEffect(() => {
    22. //这里是项目的api,其他地方未必会是这样
    23. window.addEventListener('message', clearCache, false);
    24. return () => {
    25. //页面销毁的时候,清空事件监听
    26. window.removeEventListener('message', clearCache, false);
    27. };
    28. }, []);
    29. return <div />;
    30. };
    31. /**
    32. * @param key 页面组件的文件路径 例如:'/baidu/something/doing'
    33. * @param children 要被包装的React页面组件
    34. * @returns
    35. */
    36. const KeepAliveBoundarie: FC<Iprops> = props => {
    37. const keepAliveKey = props.name;
    38. return (
    39. <KeepAlive name={keepAliveKey}>
    40. {props.children}
    41. <ChildDemo name={keepAliveKey} />
    42. </KeepAlive>
    43. );
    44. };
    45. export default KeepAliveBoundarie;

    使用:

    1. import React from 'react';
    2. import { XpKeepAlive } from '@/components';
    3. import Demo from './kIndex';
    4. export default () => {
    5. return (
    6. <XpKeepAlive name='这里最好填写页面对应的路由路径,避免出现重复'>
    7. <Demo />
    8. </XpKeepAlive>
    9. );
    10. };

    注意:

            react-activation和react的context有一定的关系,如果你需要把缓存的功能抽到npm包时候,切记一定要保证npm里面的react版本和你的程序的react版本一样。

            可以选择配置npm里面的react以你的项目的react版本为主(参考webpack externals),否则会出现两个react程序的情况,这样缓存由npm包里面的react维护,和你的主程序是隔离的。

    作者对这个问题的回复链接

  • 相关阅读:
    搜索与图论:深度优先搜索
    Python+Appium自动化测试-编写自动化脚本
    【计算机毕设选题推荐】超市管理系统SpringBoot+SSM+Vue
    一站式DevOps真的能提速增效吗?TVP吐槽大会邀您来验证
    二叉树的遍历
    互融云汽车金融系统开发 “互联网+汽车金融”业务平台开发 助力打造立体化管理平台
    同样是Java程序员,年薪10W和35W的差别在哪?
    solidty-基础篇-基础语法和定义函数
    【 构建maven工程时,配置了阿里云的前提下,依旧使用中央仓库下载依赖导致失败的问题!】
    埃及市场开发攻略,收藏一篇就够了
  • 原文地址:https://blog.csdn.net/u014071104/article/details/126761613
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号