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

react18中引入redux及react-redux来管理公共数据仓库

前面已经介绍了redux的用法,但是在实际项目中,还是不够用的,不仅写法操作比较繁琐,而且实现的功能还有限,这篇我们引入官方推荐的react-redux来简化我们的代码

实现效果

请添加图片描述

代码改造

  • 安装相关依赖
npm i react-redux

store.js改写

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

import { CounterReducer } from "./CounterReducer";

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

const store = createStore(reducers);

export default store;

CounterReducer.js改写

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

export { CounterReducer };

DemoA.js

import { useSelector } from "react-redux";

function DemoA() {
  const count = useSelector((state) => state.getIn(["count", "counter"]));
  return (
    <div>
      <p> Demo A count: {count}</p>
    </div>
  );
}
export default DemoA;

DemoB.js

import { useSelector, useDispatch } from "react-redux";
import { Button, Space, Divider } from "antd";
function DemoB() {
  const count = useSelector((state) => state.getIn(["count", "counter"]));
  const userInfo = useSelector((state) => state.getIn(["count", "userInfo"]));
  const dispatch = useDispatch();
  return (
    <div>
      <p>Demo B</p>
      <div>
        <Space split={<Divider />}>
          <span>name: {userInfo.get("name")}</span>
          <span>age: {userInfo.get("age")}</span>
          <span>count:{count}</span>
        </Space>
      </div>
      <Space>
        <Button type="primary" onClick={() => dispatch({ type: "ADD" })}>
          add count
        </Button>
        <Button type="primary" danger onClick={() => dispatch({ type: "DEC" })}>
          minus count
        </Button>
        <Button
          type="dashed"
          danger
          onClick={() => dispatch({ type: "CHANGE_NAME", payload: "张学友" })}
        >
          change name
        </Button>
      </Space>
    </div>
  );
}
export default DemoB;

index.js

import DemoA from "./DemoA";
import DemoB from "./DemoB";
import store from "../../store/index";
import { useEffect, useState } from "react";
import { Divider, Space } from "antd";
import { useSelector } from "react-redux";
function Redux() {
  const counter = useSelector((state) => state.getIn(["count", "counter"]));
  return (
    <div>
      Redux parent count:{counter}
      <Divider />
      <Space split={<Divider type="vertical" />}>
        <DemoA />
        <DemoB />
      </Space>
    </div>
  );
}

export default Redux;

引入了react-redux后的,代码的确是清爽了很多,没有之前的臃肿了。

总结

  • useSelector获取store中的数据
  • useDispatch触发reducer中的方法
  • immutablefromJS方法可以去官网参考它对不同类型的数据操作使用

http://www.kler.cn/a/370585.html

相关文章:

  • 聊聊如何实现Android 放大镜效果
  • 迅为瑞芯微RK3562开发板/核心板应用于人脸跟踪、身体跟踪、视频监控、自动语音识别(ASR)、图像分类驾驶员辅助系统(ADAS)...
  • 多个页面一张SQL表,前端放入type类型
  • UI自动化测试:异常截图和page_source
  • 探索与创作:2024年CSDN平台上的成长与突破
  • Jenkins-基于Role的鉴权机制
  • 什么是高存储服务器,有哪些优势,如何选择?
  • 单元测试详解
  • 语音语言模型最新综述! 关于GPT-4o背后技术的尝试
  • 安卓两个活动之间的消息传输(收到消息后基于应答)
  • 企业财务管理:从每刻到金蝶云星空的报销单集成案例
  • 实验03分支7-13 算术入门之加减乘除
  • 【ACM出版,EI稳定检索,九大高校联合举办, IEEE Fellow支持】2024年计算机视觉与艺术研讨会(CVA 2024)
  • HarmonyOS“一次开发,多端部署”
  • 即插即用篇 | YOLOv8 引入 空间和通道协同注意力模块 SCSA
  • 【计算机网络一】网络学习前置知识
  • 十四:Python学习笔记--基础知识完结(12)写几个案例 打包exe出来 齐活
  • 1.机器人抓取与操作介绍-深蓝学院
  • softmax回归简洁实现
  • Flutter Row组件实战案例
  • 软考:CORBA架构
  • 高效文本编辑与导航:Vim中的三种基本模式及粘滞位的深度解析
  • 【C++刷题】力扣-#448-找到所有数组中消失的数字
  • 关于整理EACO地球链500个问答0.1的建议,请用数字1-500列出来,谢谢20241028。
  • 使用Django框架开发企业级Web应用
  • NUUO网络视频录像机upload.php任意文件上传漏洞复现