当前位置: 首页 > article >正文

react18中使用redux管理公共数据仓库实现数据immutable更新

Immutable.js出自Facebook,是最流行的不可变数据结构的实现之一。它实现了完全的持久化数据结构,使用结构共享。所有的更新操作都会返回新的值,但是在内部结构是共享的,来减少内存占用。Immutablejs官网

在上一篇介绍redux的文章,我们可以看到在创建的reducer中进行数据更改的时候,会使用…来复制状态数据,为的就是不对原数据进行直接修改,只做替换,就是为了实现react的数据不可变immutable。也就是说如果state的数据比较简单那还好,万一比较复杂,就要复制很多这样的结构数据,很占内存影响app的性能。
在这里插入图片描述

安装

npm i immutable redux-immutable -S

替换redux中的combineReducers,改用redux-immutable里面的

import { createStore } from "redux";
import { combineReducers } from "redux-immutable";

import { CounterReducer } from "./CounterReducer";

const reducers = combineReducers({
  count: CounterReducer,
});

let store = createStore(reducers);

store.subscribe(() => console.log(store.getState()));

export default store;

改造reducers里面的代码

import { fromJS } from "immutable";
const initialState = fromJS({
  counter: 0,
  userInfo: {
    name: "John Doe",
    age: 25,
  },
});
function CounterReducer(state = initialState, action) {
  switch (action.type) {
    case "ADD":
      return state.update("counter", (val) => {
        console.log("🚀 ~ returnstate.update ~ val:", val);
        return val + 1;
      });
    case "DEC":
      return state.update('counter',value => value - 1)
    default:
      return state;
  }
}

export { CounterReducer };

组件里面使用方式变化
DemoA.js

import store from "../../store";
function DemoA() {
  const count = store.getState().get("count").get("counter");
  return (
    <div>
      <p> Demo A count: {count}</p>
    </div>
  );
}
export default DemoA;

DemoB.js

import store from "../../store";

function DemoB() {
  const data = store.getState().get("count");
  return (
    <div>
      <p>Demo B</p>
      <div>
        <span>name: {data.getIn(["userInfo", "name"])}</span> <br />
        <span>age: {data.getIn(["userInfo", "age"])}</span>
        <span>count:{data.get("counter")}</span>
      </div>
      <button onClick={() => store.dispatch({ type: "ADD" })}>add count</button>
    </div>
  );
}
export default DemoB;

index.js

import DemoA from "./DemoA";
import DemoB from "./DemoB";
import store from "../../store/index";
import { useEffect, useState } from "react";
function Redux() {
  console.log(store.getState(), "store.getState()");
  const [counter, setCount] = useState(
    store.getState().get("count").get("counter")
  );
  useEffect(() => {
    const unsubscribe = store.subscribe(() => {
      console.log("aaaa");
      setCount(store.getState().get("count").get("counter"));
    });
    return () => {
      unsubscribe();
    };
  }, [counter]);
  return (
    <div>
      Redux
      <hr />
      parent count:{counter}
      <DemoA />
      <DemoB />
    </div>
  );
}

export default Redux;

实现了同样的效果
请添加图片描述


http://www.kler.cn/news/366341.html

相关文章:

  • 等保测评:安全计算环境的详细讲解
  • python实战(一)——iris鸢尾花数据集分类
  • 理解深度学习模型——高级音频特征表示的分层理解
  • 任务看板是什么?如何选择合适的任务看板工具?
  • Django项目实战-图书管理系统之项目搭建
  • Geranium天竺葵:位置修改、守护进程管理器、清理器、屏幕时间删除器和 TrollStore 监督器
  • 数据集成进化论:从传统 ETL 到数据编织的跨越
  • 004:ABBYY PDF Transformer安装教程
  • Unity地面检测、跳跃
  • Python基础知识-标准库与第三方库
  • 详细解读Movie Gen(2):个性化视频训练
  • 使用JUC包的AtomicXxxFieldUpdater实现更新的原子性
  • 基于SpringBoot设计模式之结构型设计模式·组合模式
  • Etcd 可观测最佳实践
  • 基于neo4j知识图谱的图书推荐借阅系统
  • 尚硅谷-react教程-求和案例-优化3-整合UI组件和容器组件-总结优化-笔记
  • 机器学习3
  • 【Java】java 集合框架(详解)
  • 高可用开源库之 Hystrix-01-概览
  • FileLink跨网文件交换平台——能源化工行业的安全传输解决方案
  • 近似线性可分支持向量机的原理推导
  • adb常见指令以及问题解决
  • 认识CSS语法
  • YOLOv8_ ByteTrack目标跟踪、模型部署
  • 青少年编程与数学 02-002 Sql Server 数据库应用 06课题、数据库操作
  • 学习笔记——动态路由——OSPF(距离矢量协议)OSPF路由类型