前言:还在为 Redux 繁琐的样板代码(Boilerplate)头秃吗?还在写无休止的
switch-case和action 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.js 或 main.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,我们省去了什么:
- ✅ 不再需要 手动定义
ACTION_TYPES常量字符串(比如'INCREMENT')。 - ✅ 不再需要 写冗长的
switch...case语句。 - ✅ 不再需要 手动做不可变更新(
return { ...state, value: state.value + 1 }),直接state.value += 1即可,Immer 库在底层为你保驾护航。 - ✅ 不再需要 复杂的
combineReducers配置,configureStore一键搞定。
一句话总结: RTK 就是把复杂的仓库管理变成了**“定义片区 -> 制定简单规则 -> 组件直接调用”**的流水线模式。
快去你的项目里试试吧!