5分钟掌握React的Redux Toolkit + Redux

Redux Toolkit + Redux 教程

1. 引言

本教程介绍如何使用 Redux Toolkit(RTK)TypeScript 搭建 Redux 状态管理系统。

我们将创建一个 计数器(Counter)待办事项(Todo) 模块,并学习 Redux 的核心 API,如 createSliceconfigureStoreuseSelectoruseDispatch


2. 依赖安装

在 React 项目中安装 Redux Toolkit 和 React-Redux:

bash 复制代码
npm install @reduxjs/toolkit react-redux

如果使用 TypeScript,还需安装类型支持:

bash 复制代码
npm install -D @types/react-redux

3. 代码实现

3.1 定义 State 类型

ts 复制代码
// 定义 Counter 组件的状态类型
interface CounterState {
  value: number
  title: string    // 添加一个新字段,展示更多状态管理
}

// 定义初始状态
const initialState: CounterState = {
  value: 0,
  title: "计数器"
};

3.2 创建多个 Slice

Redux Toolkit 通过 createSlice 简化了 Redux 的 reduceraction 创建。

创建 counterSlice
ts 复制代码
import { createSlice, PayloadAction } from "@reduxjs/toolkit";

const counterSlice = createSlice({
  name: "counter",  // Slice 名称
  initialState,     // 初始状态
  reducers: {
    increment: (state, action: PayloadAction<number>) => {
      state.value += action.payload;
    },
    decrement: (state, action: PayloadAction<number>) => {
      state.value -= action.payload;
    },
    reset: (state) => {
      state.value = 0;
    },
    setTitle: (state, action: PayloadAction<string>) => {
      state.title = action.payload;
    },
    incrementAndSetTitle: (state, action: PayloadAction<{ amount: number; title: string }>) => {
      state.value += action.payload.amount;
      state.title = action.payload.title;
    }
  }
});
创建 todoSlice
ts 复制代码
const todoSlice = createSlice({
  name: "todos",  // 不同的 Slice
  initialState: { items: [] },
  reducers: {
    addTodo: (state, action) => {
      state.items.push(action.payload);
    }
  }
});

3.3 创建 Redux Store

ts 复制代码
import { configureStore } from "@reduxjs/toolkit";

const store = configureStore({
  reducer: {
    counter: counterSlice.reducer,
    todos: todoSlice.reducer
  }
});

export default store;

📌 Redux Toolkit 默认启用了 Redux DevTools 和 Redux Thunk,简化了开发流程。


3.4 导出 Action Creators

ts 复制代码
const { decrement } = counterSlice.actions;
const { addTodo } = todoSlice.actions;

3.5 创建 Redux 类型

ts 复制代码
// 从 store 推导出 RootState 类型
export type RootState = ReturnType<typeof store.getState>;
// 推导出 dispatch 类型
export type AppDispatch = typeof store.dispatch;

这样可以在 useSelectoruseDispatch 中提供正确的类型支持。


3.6 创建 Counter 组件

tsx 复制代码
import React from "react";
import { useSelector, useDispatch } from "react-redux";
import { RootState } from "./store";
import { increment, decrement, reset, setTitle, incrementAndSetTitle, addTodo } from "./store";

const Counter = () => {
  const count = useSelector((state: RootState) => state.counter.value);
  const title = useSelector((state: RootState) => state.counter.title);
  const dispatch = useDispatch();

  return (
    <div>
      <h2>{title}: {count}</h2>
      <div>
        {/* 触发状态更新 */}
        <button onClick={() => dispatch(increment(1))}>+1</button>
        <button onClick={() => dispatch(increment(5))}>+5</button>
        <button onClick={() => dispatch(decrement(1))}>-1</button>
        <button onClick={() => dispatch(decrement(5))}>-5</button>
        <button onClick={() => dispatch(reset())}>重置</button>

        {/* 修改标题 */}
        <input 
          value={title}
          onChange={(e) => dispatch(setTitle(e.target.value))}
          placeholder="输入新标题"
        />

        {/* 组合 action */}
        <button 
          onClick={() => 
            dispatch(incrementAndSetTitle({ 
              amount: 10, 
              title: "增加了10!" 
            }))
          }
        >
          增加10并更新标题
        </button>

        {/* 添加任务 */}
        <button onClick={() => dispatch(addTodo("新任务"))}>添加任务</button>
      </div>
    </div>
  );
};

3.7 创建根组件

tsx 复制代码
import { Provider } from "react-redux";
import store from "./store";
import Counter from "./Counter";

export const CounterApp = () => {
  return (
    <Provider store={store}>
      <Counter />
    </Provider>
  );
};

4. 总结

  • createSlice :定义 reduceraction creators
  • configureStore :创建 store 并自动配置 Redux DevToolsRedux Thunk
  • useSelector :从 store 读取状态。
  • useDispatch :分发 action 进行状态更新。

📌 通过 Redux Toolkit,我们大大简化了 Redux 的使用,让代码更加简洁、高效!

相关推荐
学问小小谢7 分钟前
第28节课:前端项目实战—从需求分析到开发流程的全方位指南
前端·网络·安全·web安全·性能优化·html5·需求分析
16年上任的CTO7 分钟前
vue生命周期及其作用
前端·javascript·vue.js·vue
桂月二二40 分钟前
深入探讨前端新技术:CSS Container Queries 的应用与实践
前端·css
小郑T_T1 小时前
BEM规范
前端·css·vue.js
小汤猿人类1 小时前
vue3 store刷新失效场景解决方案
前端
LCG元2 小时前
Vue.js组件开发-实现广告图片浮动随屏幕滚动
前端·javascript·vue.js
_未知_开摆3 小时前
el-table表格点击单元格实现编辑
前端·javascript·vue.js·elementui
_island4 小时前
《Cursor-AI编程》基础篇-Tab代码智能补充
前端·javascript·aigc
大模型铲屎官5 小时前
前端表单验证终极指南:HTML5 内置验证 + JavaScript 自定义校验
前端·javascript·html·html5·表单验证·内置验证·自定义校验