React 词条目录
前端Wiki/React/实战/上线与排错

状态管理选型

状态管理选型的分水岭是“数据规模与更新频率”:组件内数据用 useState/useReducer;跨组件共享少量全局数据用 Context(主题、登录态);大量数据、频繁更新、多组件订阅(购物车、 Feed 流)上 Zustand 或 Redux Toolkit。

Zustand 是目前轻量首选:一个 create() 生成可共享的 store,组件用 useStore(s => s.count) 选择订阅,没有 Provider 包裹、没有 action 模板代码。Redux 仍是大型项目可选项——Redux Toolkit + RTK Query 把样板代码降到可接受范围。

  • useState/useReducer:组件内部状态
  • Context:全局只读 / 低频数据(主题、用户、语言)
  • Zustand / Redux Toolkit:高频更新的大量共享数据
状态管理
// 方案对比(伪代码,展示思路差异)

// ① Context:适合低频全局数据
const ThemeCtx = createContext();
function App() {
  const [user, setUser] = useState(null);
  return <ThemeCtx.Provider value={{ user, setUser }}><Pages/></ThemeCtx.Provider>;
}

// ② Zustand:API 最少的共享 store
// import { create } from 'zustand';
const useCart = create((set) => ({
  items: [],
  add: (item) => set(state => ({ items: [...state.items, item] })),
  clear: () => set({ items: [] }),
}));

function Cart() {
  // 选择器订阅:只订阅 items,别处更新不重渲染本组件
  const items = useCart(state => state.items);
  const add = useCart(state => state.add);
  return <button onClick={() => add({ id: Date.now() })}>加购</button>;
}

// ③ Redux Toolkit:大型项目、强约束、有生态(RTK Query / 持久化)
// const { configureStore, createSlice } = require('@reduxjs/toolkit');
const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0 },
  reducers: {
    addOne: (state) => { state.value += 1; },   // Immer 让你可以“直接改”
  },
});
const store = configureStore({ reducer: { counter: counterSlice.reducer } });
本节要点选型口诀:组件内 useState → 全局低频 Context → 高频大量 Zustand(轻)/ Redux Toolkit(大)。