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 的使用,让代码更加简洁、高效!

相关推荐
UXbot4 小时前
UI设计工具推荐合集
前端·人工智能·ui
摘星编程4 小时前
React Native + OpenHarmony:Accelerometer计步器代码
javascript·react native·react.js
敲敲了个代码5 小时前
如何优化批量图片上传?队列机制+分片处理+断点续传三连击!(附源码)
前端·javascript·学习·职场和发展·node.js
@AfeiyuO5 小时前
Vue 引入全局样式scss
前端·vue·scss
光影少年5 小时前
flex布局和grid布局区别,实现两边固定布局中间自适应
前端·css3·web·ai编程
全栈测试笔记5 小时前
异步函数与异步生成器
linux·服务器·前端·数据库·python
EndingCoder5 小时前
配置 tsconfig.json:高级选项
linux·前端·ubuntu·typescript·json
木风小助理6 小时前
JavaStreamAPI的性能审视,优雅语法背后的隐形成本与优化实践
java·前端·数据库
white-persist7 小时前
轻松抓包微信小程序:Proxifier+Burp Suite教程
前端·网络·安全·网络安全·微信小程序·小程序·notepad++
敲敲了个代码8 小时前
多标签页强提醒不重复打扰:从“弹框轰炸”到“共享待处理队列”的实战
java·前端·javascript·面试·架构