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

【大前端】React 使用 Redux 实现组件通信的 Demo 示例

React 使用 Redux 实现组件通信的 Demo 示例

在 React 项目中,父子组件通信通常依赖 props,兄弟组件通信则通过 状态提升Context。但是当应用逐渐复杂时,这种方式会显得繁琐。此时 Redux 就派上用场了 —— 它可以集中管理全局状态,任何组件都能方便地订阅和修改状态。

本文将带你实现一个简单的 计数器 demo,演示 Redux 在 React 中的组件通信。


一、环境准备

安装必要依赖:

npm install @reduxjs/toolkit react-redux

Redux Toolkit(RTK)是 Redux 官方推荐的写法,简化了很多冗余代码。


二、目录结构

src/store.tsfeatures/counter/counterSlice.tsCounterA.tsxCounterB.tsxApp.tsxindex.tsxhooks.ts

这里我们会写两个兄弟组件:CounterACounterB,通过 Redux 实现通信。


三、配置 Redux Store

src/store.ts

import { configureStore } from "@reduxjs/toolkit";
import counterReducer from "./features/counter/counterSlice";export const store = configureStore({reducer: {counter: counterReducer,},
});export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;

四、定义 Slice(状态逻辑)

src/features/counter/counterSlice.ts

import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { RootState } from "../../store";interface CounterState {value: number;
}const initialState: CounterState = { value: 0 };const counterSlice = createSlice({name: "counter",initialState,reducers: {increment: (state) => {state.value += 1;},decrement: (state) => {state.value -= 1;},addBy: (state, action: PayloadAction<number>) => {state.value += action.payload;},},
});export const { increment, decrement, addBy } = counterSlice.actions;
export default counterSlice.reducer;// 选择器
export const selectCount = (state: RootState) => state.counter.value;

五、封装 Typed Hooks(TS推荐)

src/hooks.ts

import { TypedUseSelectorHook, useDispatch, useSelector } from "react-redux";
import type { RootState, AppDispatch } from "./store";export const useAppDispatch = () => useDispatch<AppDispatch>();
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;

六、兄弟组件通信示例

CounterA.tsx

import React from "react";
import { useAppDispatch } from "../../hooks";
import { increment, addBy } from "./counterSlice";export default function CounterA() {const dispatch = useAppDispatch();return (<div style={{ border: "1px solid #ccc", padding: 10, margin: 10 }}><h3>我是 CounterA</h3><button onClick={() => dispatch(increment())}>+1</button><button onClick={() => dispatch(addBy(5))}>+5</button></div>);
}

CounterB.tsx

import React from "react";
import { useAppSelector } from "../../hooks";
import { selectCount } from "./counterSlice";export default function CounterB() {const count = useAppSelector(selectCount);return (<div style={{ border: "1px solid #ccc", padding: 10, margin: 10 }}><h3>我是 CounterB</h3><p>当前计数:{count}</p></div>);
}

七、应用入口

App.tsx

import React from "react";
import CounterA from "./features/counter/CounterA";
import CounterB from "./features/counter/CounterB";export default function App() {return (<div style={{ padding: 20 }}><h2>Redux 通信 Demo</h2><CounterA /><CounterB /></div>);
}

index.tsx

import React from "react";
import { createRoot } from "react-dom/client";
import { Provider } from "react-redux";
import { store } from "./store";
import App from "./App";const root = createRoot(document.getElementById("root")!);
root.render(<Provider store={store}><App /></Provider>
);

八、运行效果

  1. 点击 CounterA 中的 +1+5 按钮,会触发 Redux 的 dispatch,修改全局状态。
  2. CounterB 会实时响应,展示最新的计数值。

👉 这就实现了 兄弟组件通信,而且随着应用规模扩大,你只需要在需要的地方使用 Redux,不再需要复杂的 props 传递。


九、总结

  • 父子通信:直接用 props。
  • 兄弟通信:Redux 是一种集中化管理方式,适合跨层级或复杂场景。
  • Redux Toolkit 简化了 reducer 和 action 的写法,官方推荐。
  • 在更大规模应用中,还可以结合 Redux Persist(持久化存储)、RTK Query(数据请求管理)。

http://www.xdnf.cn/news/19696.html

相关文章:

  • Vue 评论组件设计 V1.0
  • JVM 的 C1/C2 编译器
  • AI在金融、医疗、教育、制造业等领域的落地案例(含代码、流程图、Prompt示例与图表)
  • Archlinux KDE 下 Fcitx5 输入法的配置与美化
  • 第二十章 ESP32S3 IIC_EEPROM 实验
  • 【计算机网络】TCP状态转移
  • 开发板直连电脑的搭建网络环境(以正点原子阿尔法imx6ull开发板为讲解)
  • Flutter代码生成:告别重复劳动,效率飙升
  • 《我是如何用C语言写工控系统的漏洞和Bug》连载(1)内容大纲
  • FART 自动化脱壳框架优化实战:Bug 修复与代码改进记录
  • 充电枪结构设计-经验总结
  • 计算机网络:概述层---TCP/IP参考模型
  • shell编程从0基础--进阶 1
  • Day20_【机器学习—逻辑回归 (1)—原理】
  • 电子病历空缺句的语言学特征描述与自动分类探析(以GPT-5为例)(上)
  • 找Jenkins代替工具,可以体验下这款国产开源CICD工具
  • Web 集群高可用全方案:Keepalived+LVS (DR) 负载均衡 + Apache 服务 + NFS 共享存储搭建指南
  • 【C++】深入浅出:string类模拟实现全解析
  • 碰一下可打开小程序,在web系统中如何嵌入将小程序写入NFC
  • 企业文档安全守护者全面测评:7款加密软件深度解析,让商业机密固若金汤
  • Parasoft C/C++test案例:基于CERT/CWE的代码合规自动化
  • 力扣hot100:螺旋矩阵(边界压缩,方向模拟)(54)
  • Canaan 阿瓦隆 A1246I 81T矿机评测:性能、功耗与能效全面分析
  • 高效对象属性复制工具
  • 2025 年行政岗转型突破:解锁技能提升新方向
  • 【V8引擎】介绍
  • 基因表达数据的K-M生存曲线的数据处理及绘制
  • C++条件变量学习
  • UML状态图之trigger(触发器)、guard(守卫条件)和action(动作)
  • Linux 文本处理神器——sed