爆肝 20 行代码!让 Redux 像 zustand 一样优雅,从此告别 action 地狱!

101 阅读2分钟

爆肝 20 行代码!让 Redux 像 zustand 一样优雅,从此告别 action 地狱!

本文能为你省下 10000 行代码,手把手教你用 20 行魔改 Redux,实现现代化状态管理!🔥

一、Redux 的痛点再暴击

  1. 样板代码地狱:action/types/reducer 三件套劝退新人

  2. 更新繁琐:每次都要 dispatch({type: 'XXX'})

  3. 状态合并困难:手动展开旧 state 烦到抓狂

  4. React 18 兼容性:并发模式下订阅失效风险

二、核弹级解决方案

核心代码(先马后看)

// 超浓缩 reducer
const reducer = (state = {}, { type, action: payload }) => {
  const newState = typeof payload === "function" ? payload(state) : payload;
  return { ...state, ...newState };
};

// 现代化 Hook 封装
const useStore = (store, selector) =>
  useSyncExternalStore(store.subscribe, () => selector(store.getState()));

// 极简 create 函数
export const create = (createState) => {
  const store = createStore(reducer);
  /*...*/
  return (selector) => useStore(store, selector);
};

三、四大杀手级特性

3.1 像 useState 一样写 Redux

// 传统写法
dispatch({ type: "SET_USER", payload: { name: "Jack" } });

// 现在直接起飞!
setState({ name: "Jack" });
// 甚至支持函数更新
setState((state) => ({ count: state.count + 1 }));

3.2 自动合并状态

// 传统写法
const newState = { ...state, ...newState };
// 现在直接修改!
setState({ name: "Jack" });

3.3 零成本迁移

  1. 去掉烦人的 Provider 和 connect,直接拿来用
  2. 把 reducer 替换成一个函数,直接返回新状态
  3. 把 createStore 替换成 create

3.4 完美兼容 React 18

// 使用官方推荐的 useSyncExternalStore
const state = useStore(store, selector);

四、原理大揭秘

4.1 核心实现流程图

yuanlitu.png

4.2 核心代码解析

  1. 万能 Reducer:通过 typeof payload === 'function'判断函数式更新

  2. 状态合并黑科技:Object.assign 保证不可变性

五、最佳实践场景

✅ 中小型项目快速原型 ✅ 需要渐进式改造的老项目 ✅ 追求开发体验的创业团队 ✅ 想深入理解状态管理的开发者

六、实战教学

const useStore = create((set) => ({
  count: 0,
  inc: () => set((state) => ({ count: state.count + 1 })),
  incAsync: () => {
    setTimeout(() => {
      set((state) => ({ count: state.count + 1 }));
    }, 1000);
  },
}));

const Counter = () => {
  const count = useStore((s) => s.count);
  const inc = useStore((s) => s.inc);
  const incAsync = useStore((s) => s.incAsync);

  return (
    <>
      <span>{count}</span>
      <button onClick={inc}>+1</button>
      <button onClick={incAsync}>+1 async</button>
    </>
  );
};

七、总结与展望

这个方案的价值不在于替代 Redux,而是打开新思路。通过本文你可以:

  1. 深入理解 Redux 核心原理

  2. 掌握 Hook 与 Store 的融合技巧

  3. 获得状态管理库的封装方法论

下一步计划: 🚀 添加 middleware 支持 🛡 完善 TypeScript 类型推导 ⚡ 优化批量更新性能


如果本文帮你省下了头发,请点赞收藏! 有更好的想法欢迎评论区 battle!💥