当前位置: 首页 > news >正文

基于 React Hook 封装 Store 的三种方案

基于 React Hook 封装 Store 的三种方案

方案一:基于 useSyncExternalStore 的轻量级 Store(推荐)
import { useSyncExternalStore } from 'react';type Store<T> = {state: T;listeners: Set<() => void>;
};function createStore<T>(initialState: T) {const store: Store<T> = {state: initialState,listeners: new Set(),};const setState = (updater: (prev: T) => T) => {store.state = updater(store.state);store.listeners.forEach(listener => listener());};const subscribe = (listener: () => void) => {store.listeners.add(listener);return () => store.listeners.delete(listener);};const useStore = <S>(selector: (state: T) => S): S => {return useSyncExternalStore(subscribe,() => selector(store.state),() => selector(initialState));};return [useStore, setState] as const;
}

特性:零依赖、无 Provider、精准渲染

方案二:基于 Context + useReducer
import { createContext, useContext, useReducer } from 'react';type State = { count: number };
type Action = { type: 'INCREMENT' } | { type: 'DECREMENT' };const StoreContext = createContext<{state: State;dispatch: React.Dispatch<Action>;
}>(null!);function StoreProvider({ children }) {const [state, dispatch] = useReducer((prev: State, action: Action) => {switch (action.type) {case 'INCREMENT': return { ...prev, count: prev.count + 1 };case 'DECREMENT': return { ...prev, count: prev.count - 1 };default: return prev;}},{ count: 0 });return (<StoreContext.Provider value={{ state, dispatch }}>{children}</StoreContext.Provider>);
}function useStore() {const { state, dispatch } = useContext(StoreContext);return {count: state.count,increment: () => dispatch({ type: 'INCREMENT' }),decrement: () => dispatch({ type: 'DECREMENT' })};
}

优势:支持中间件、复杂状态管理

方案三:基于闭包的轻量实现
import { useState, useMemo } from 'react';function createStore<T>(initialState: T) {let state = initialState;const listeners = new Set<() => void>();const setState = (updater: (prev: T) => T) => {state = updater(state);listeners.forEach(listener => listener());};function useStore(): [T, typeof setState] {const [, forceUpdate] = useState({});useMemo(() => {listeners.add(forceUpdate);return () => { listeners.delete(forceUpdate); };}, []);return [state, setState];}return useStore;
}

特点:<20行代码实现

方案选型对比
方案适用场景优点缺点
useSyncExternalStore大型应用全局状态高性能、无 Provider 污染需要 React 18+
Context + Reducer复杂业务流支持中间件、类型安全需要 Provider 包裹
闭包实现小型应用/组件间共享实现简单、零依赖无法跨组件树隔离状态

相关文章:

  • 基于大模型的脑出血智能诊疗与康复技术方案
  • 视觉Transformer(Vision Transformer , ViT )
  • 2025/5/16
  • 炼丹学习笔记3---ubuntu2004部署运行openpcdet记录
  • 数学复习笔记 14
  • 精准掌控张力动态,重构卷对卷工艺设计
  • DAY 28 类的定义
  • 内容中台重构企业知识管理路径
  • 力扣HOT100之二叉树:102. 二叉树的层序遍历
  • 【GAN网络入门系列】一,手写字MINST图片生成
  • 前端取经路——量子UI:响应式交互新范式
  • 知识蒸馏实战:用PyTorch和预训练模型提升小模型性能
  • 【笔记】导出Conda环境依赖以复现项目虚拟环境
  • LLaMA-Factory:准备模型和数据集
  • 详解具身智能开源数据集:ARIO(All Robots In One)
  • Java 多线程基础:Thread 类核心用法详解
  • RabbitMQ 消息模式实战:从简单队列到复杂路由(三)
  • 第一次做逆向
  • LLaMA-Factory:环境准备
  • 【全解析】EN18031标准下的SSM安全存储机制
  • 篮球培训机构东方启明星被指停摆,家长称已登记未退费用超百万
  • 从近200件文物文献里,回望光华大学建校百年
  • 就规范涉企行政执法专项行动有关问题,司法部发布解答
  • 俄乌代表团抵达谈判会场
  • 沃尔玛上财季净利下滑12%:关税带来成本压力,新财季价格涨幅将高于去年
  • 美国务卿会见叙利亚外长,沙特等国表示将支持叙利亚重建