React15 - 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'; // 导入 reducer

export 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 creators

export function Counter() {
  // 使用 useSelector 从 Redux store 中读取 count 值
  const count = useSelector((state) => state.counter.value);
  // 获取 dispatch 函数
  const dispatch = useDispatch();

  return (
    <div>
      <div>
        <button
          aria-label="Increment value"
          // 点击时 dispatch increment 这个 action
          onClick={() => dispatch(increment())}
        >
          Increment
        </button>
        <span>{count}</span>
        <button
          aria-label="Decrement value"
          // 点击时 dispatch decrement 这个 action
          onClick={() => 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 触发更新
posted @ 2026-03-15 22:03  箫笛  阅读(2)  评论(0)    收藏  举报