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

Redux - react-redux 的工作原理和使用

React-Redux 是 Redux 官方提供的 React 绑定库,它的核心作用是将 Redux 的 store 和 React 组件连接起来,让 React 组件能方便地读取和更新全局状态 。简单来说,它就像一座桥梁,把 React 的 UI 和 Redux 的状态管理无缝衔接起来。

它的工作原理主要围绕两个核心部分展开:

  1. <Provider> 组件:这是一个顶层组件,它接收 Redux store 作为属性,并通过 React 的 Context 机制,将 store 传递给应用中的所有子组件,让它们都能访问到全局状态 。
  2. 连接函数(Hooks / connect:这是 React 组件与 Redux store 交互的接口。它负责从 store 中读取数据,并将这些数据以 props 或 Hook 返回值的形式传递给组件。同时,它也接收组件发出的动作,并调用 store 的 dispatch 方法来更新状态 。

目前,官方推荐使用 React-Redux Hooks 的方式来连接组件,它比传统的 connect 函数更简洁、易用 。

下面,我们通过一个经典的计数器示例,来一步步展示它的完整工作流程。

💡 React-Redux 使用步骤

第一步:安装必要的依赖

首先,需要在项目中安装 Redux Toolkit 和 React-Redux。Redux Toolkit 是官方推荐的新一代 Redux 编写方式,它能极大地简化代码 。

npm install @reduxjs/toolkit react-redux

第二步:创建 Redux Store (状态仓库)

使用 Redux Toolkit 的 configureStore API 来创建一个 store。通常我们会将应用的不同功能拆分成多个 "slice"(切片)来管理 。

// app/store.js
import { configureStore } from '@reduxjs/toolkit';
// 后续会引入 counter 的 reducer
// import counterReducer from '../features/counter/counterSlice';export default configureStore({reducer: {// counter: counterReducer},
});

第三步:为 React 应用提供 Store

在应用的入口文件(如 index.js)中,使用 <Provider> 组件将我们刚创建的 store 注入到整个 React 应用中 。

// index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { Provider } from 'react-redux';
import store from './app/store';const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Provider store={store}><App /></Provider>
);

第四步:创建 State Slice (状态切片)

创建一个 "slice" 来定义状态的一部分、它的初始状态,以及如何更新状态的 "reducers"(归约器)。这里我们可以直接编写 "mutable"(可变)的逻辑,Redux Toolkit 内部的 Immer 库会自动将其转换成不可变的更新 。

// features/counter/counterSlice.js
import { createSlice } from '@reduxjs/toolkit';export const counterSlice = createSlice({name: 'counter', // slice 的名称initialState: { // 初始状态value: 0,},reducers: { // 定义更新状态的函数increment: (state) => {state.value += 1;},decrement: (state) => {state.value -= 1;},incrementByAmount: (state, action) => {state.value += action.payload;},},
});// 导出生成的 action creators(动作创建器)
export const { increment, decrement, incrementByAmount } = counterSlice.actions;
// 导出 reducer,用于配置 store
export default counterSlice.reducer;

创建好 slice 后,需要将它导入并添加到 store 中:

// app/store.js
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from '../features/counter/counterSlice'; // 导入 reducerexport default configureStore({reducer: {counter: counterReducer, // 将 counter 的 reducer 添加到 store 中},
});

第五步:在 React 组件中使用 State 和 Actions

最后,在 React 组件中通过 React-Redux 提供的 Hooks 来与 store 交互。useSelector 用于从 store 中读取数据,useDispatch 用于获取 dispatch 函数来触发状态更新 。

// features/counter/Counter.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement } from './counterSlice'; // 导入 action creatorsexport function Counter() {// 使用 useSelector 从 Redux store 中读取 count 值const count = useSelector((state) => state.counter.value);// 获取 dispatch 函数const dispatch = useDispatch();return (<div><div><buttonaria-label="Increment value"// 点击时 dispatch increment 这个 actiononClick={() => dispatch(increment())}>Increment</button><span>{count}</span><buttonaria-label="Decrement value"// 点击时 dispatch decrement 这个 actiononClick={() => dispatch(decrement())}>Decrement</button></div></div>);
}

这样,一个完整的 React-Redux 数据流就建立起来了:

  1. UI 事件:用户点击 "Increment" 按钮,调用 dispatch(increment())
  2. Action 分发:一个 { type: 'counter/increment' } 的 action 对象被分发(dispatched)到 store。
  3. Reducer 处理:store 将当前 state({value: 0})和该 action 交给 counterSlice 中的 reducer 处理,reducer 执行 state.value += 1
  4. State 更新:store 保存 reducer 返回的新 state({value: 1})。
  5. UI 更新:React-Redux 检测到 store 状态变化,通知使用了 useSelector<Counter> 组件,组件使用新数据(count = 1)重新渲染 。

📝 总结

总的来说,使用 React-Redux 的核心就是三步:

  1. <Provider>store 提供给整个应用
  2. createSlice 定义状态和更新逻辑,并导出 actions。
  3. 在组件中用 useSelector 读取数据,用 useDispatch 触发更新

希望这个详细的步骤能帮助你理解和使用 React-Redux。如果你对异步操作(如 API 请求)的处理感兴趣,可以接着了解 createAsyncThunk,这是 Redux Toolkit 中处理异步逻辑的推荐方式。需要我为你展开讲讲吗?

http://www.jsqmd.com/news/482389/

相关文章:

  • 让 AI 成为你的鸿蒙开发助手:harmonyos-build-deploy Skill 完全实战指南
  • 彼得林奇如何分析公司的用户增长质量
  • 结构变异检测技术:从read-pair、split-read到组装方法的综合策略
  • 数据库主从复制方案
  • 幂等实现方案
  • OpenClaw小龙虾软件原理 - yi
  • JavaDays08用户交互Scanner
  • 欧盟EU 10/2011与LFGB的差异对比
  • 扩展欧几里得(EXGCD)
  • 征程 6X Camera 接入数据评估
  • Eclipse 工作空间详解
  • 现在是 cli api 的春天时代,做 agent 想要的软件才会活下去
  • 中国电建集团华东院设计岗离职率高吗?
  • Swift 字符
  • 最大矩形面积 (赛博朋克版) —— 单调栈经典两次遍历法
  • 【Iced】stream.rs文件
  • ⚽⊔☺
  • Bootstrap5 图像形状
  • 057基于web的可追溯果蔬生产过程的管理系统-springboot+vue
  • 刚入行Java如何提升竞争力?
  • LLM 算法岗 | 八股题目 代码手撕 题目汇总与解析
  • ionic 模态窗口详解
  • 笔记3 - i
  • 大厂面试真题汇总(2026版)
  • Java程序员面试前请多刷题!
  • 二手交易平台毕业论文+PPT(附源代码+演示视频)
  • 深入解析观察者模式:从核心原理到现代框架中的高级实践
  • Redux - redux-saga中takeLates的作用
  • OpenClaw安全防护:从威胁认知到工程化加固
  • opencv中,把图片变成灰度图有什么用