拒绝繁琐!Redux Toolkit (RTK) 极简拟人化入门指南

65 阅读4分钟

前言:还在为 Redux 繁琐的样板代码(Boilerplate)头秃吗?还在写无休止的 switch-caseaction types 吗?

大人,时代变了。官方现在强烈推荐使用 Redux Toolkit (RTK) 。它不仅是 Redux 的官方工具集,更是为了简化逻辑而生。今天我们不讲晦涩的源码,我们用一个**“现代化超级仓库”**的故事,带你十分钟上手 RTK。

一、 核心概念:拟人化图解 📦

想象你的 React 应用是一个巨大的 “超级物流园”

1. Store(仓库)

这是整个物流园的总基地。所有的数据(货物)都存放在这里,严禁外人随意进出拿取,必须按规矩办事。

2. Slice(片区/部门)

仓库太大,必须分区分片管理。比如“计数器区”、“用户信息区”。每个片区都有自己的**“管理员手册”“初始库存”**。

3. State(库存)

片区里存放的具体数据。比如计数器区的当前数字是 0,这就是库存。

4. Reducer(管理员/规则制定者)

这是片区里的执行规则

  • 拟人化:管理员手里拿着一本手册,上面写着:“如果收到‘加一’的指令,就把库存 +1”。
  • RTK的魔法:在 RTK 里,管理员可以直接“修改”库存(底层由 Immer 库处理不可变性),你感觉你在直接改数据,其实 RTK 帮你处理了复杂的脏活累活。

5. Dispatch(传令兵)

组件(页面)想修改数据,不能自己动手,必须派传令兵把指令(Action)送给管理员。

6. Selector(监控探头)

组件想看数据,不需要把整个仓库搬走,只需要通过监控探头看一眼自己关心的那个数据。

二、 代码实战:三步搭建“计数器部门” 🛠️

我们要实现的功能很简单:一个计数器,能加、能减、能重置。

第一步:建立片区与制定规则 (counterSlice.js)

我们需要创建一个“计数器部门”,并制定几条铁律。

import { createSlice } from '@reduxjs/toolkit';

// 1. 初始库存:最开始是 0
const initialState = {
  value: 0,
};

// 2. 创建片区 (createSlice)
export const counterSlice = createSlice({
  name: 'counter', // 片区名字:计数器部
  initialState,
  // 3. 管理员手册 (Reducers):制定规则
  reducers: {
    // 规则一:增量
    increment: (state) => {
      // 拟人化:管理员直接把库存改了 (RTK 允许这样写,不用写 return { ...state })
      state.value += 1; 
    },
    // 规则二:减量
    decrement: (state) => {
      state.value -= 1;
    },
    // 规则三:自定义数量 (接收一个指令包 action)
    incrementByAmount: (state, action) => {
      // action.payload 就是传令兵带来的具体数字
      state.value += action.payload;
    },
  },
});

// 4. 导出指令 (Actions)
// RTK 自动帮我们把 increment 等规则生成了对应的指令牌,组件直接拿去用
export const { increment, decrement, incrementByAmount } = counterSlice.actions;

// 5. 导出这个片区的管理员 (Reducer),总仓库要用
export default counterSlice.reducer;

第二步:组建总仓库 (store.js)

现在把“计数器部门”接入到“总基地”里。

import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './counterSlice';

// 创建总仓库
export const store = configureStore({
  reducer: {
    // 这里的 key ('counter') 就是在总仓库里的片区门牌号
    counter: counterReducer,
  },
});

第三步:让应用接入仓库 (index.jsmain.jsx)

在应用的入口,把仓库的大门打开,让所有组件都能连接进来。

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { store } from './store'; // 引入总仓库
import { Provider } from 'react-redux'; // 引入连接器

ReactDOM.createRoot(document.getElementById('root')).render(
  // 用 Provider 包裹 App,把 store 传进去
  <Provider store={store}>
    <App />
  </Provider>
);

三、 组件使用:派单与查看 📱

现在来到 React 组件内部,作为用户(User),我们如何与仓库交互?

  • useSelector: 查看库存(读数据)。
  • useDispatch: 雇佣传令兵(改数据)。
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
// 引入我们刚才生成的指令牌
import { increment, decrement, incrementByAmount } from './counterSlice';

export function Counter() {
  // 1. 查看监控:只关心 counter 片区的 value 值
  const count = useSelector((state) => state.counter.value);
  
  // 2. 雇佣传令兵
  const dispatch = useDispatch();

  return (
    <div>
      <h1>当前库存: {count}</h1>
      
      <div className="card">
        {/* 派发“增加”指令 */}
        <button onClick={() => dispatch(increment())}>
          进货 (+1)
        </button>

        {/* 派发“减少”指令 */}
        <button onClick={() => dispatch(decrement())}>
          出货 (-1)
        </button>

        {/* 派发“自定义”指令,带上参数 10 */}
        <button onClick={() => dispatch(incrementByAmount(10))}>
           大批量进货 (+10)
        </button>
      </div>
    </div>
  );
}

四、 总结:RTK 到底爽在哪? 🎉

回顾一下,使用 Redux Toolkit 相比老旧的 Redux,我们省去了什么:

  1. 不再需要 手动定义 ACTION_TYPES 常量字符串(比如 'INCREMENT')。
  2. 不再需要 写冗长的 switch...case 语句。
  3. 不再需要 手动做不可变更新(return { ...state, value: state.value + 1 }),直接 state.value += 1 即可,Immer 库在底层为你保驾护航。
  4. 不再需要 复杂的 combineReducers 配置,configureStore 一键搞定。

一句话总结: RTK 就是把复杂的仓库管理变成了**“定义片区 -> 制定简单规则 -> 组件直接调用”**的流水线模式。

快去你的项目里试试吧!