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

react 自定义状态管理库

核心实现原理 :
全局状态容器:维护单一状态源
订阅机制:组件订阅状态变化
状态更新调度:通过 Hooks 触发组件重渲染

基础版实现–核心代码
// 1. 创建全局状态存储
const createStore = (initialState) => {let state = initialStateconst listeners = new Set()return {getState: () => state,setState: (newState) => {state = typeof newState === 'function' ? newState(state) : newStatelisteners.forEach(listener => listener()) // 通知所有订阅者},subscribe: (listener) => {listeners.add(listener)return () => listeners.delete(listener) // 返回取消订阅函数}}
}// 2. 创建 React Hook 绑定
const useStore = (store, selector) => {const [state, setState] = useState(() => selector(store.getState()))useEffect(() => {const unsubscribe = store.subscribe(() => {const newState = selector(store.getState())setState(newState) // 只有当选中的状态变化时才更新})return unsubscribe}, [store, selector])return state
}

使用示例

// 创建 store
const counterStore = createStore({ count: 0 })// 在组件中使用
const Counter = () => {const count = useStore(counterStore, state => state.count)return (<div><button onClick={() => counterStore.setState(s => ({ count: s.count - 1 }))}>-</button><span>{count}</span><button onClick={() => counterStore.setState(s => ({ count: s.count + 1 }))}>+</button></div>)
}
http://www.lryc.cn/news/571628.html

相关文章:

  • sql_mode(二)宽松模式和严格模式的区别
  • CHASE、CoSQL、SPARC概念介绍
  • 以list为输入条件,查询数据库表,java中的mapper层和mybatis层应该怎么写?
  • 裸金属服务器深度评测:云计算时代的性能与安全担当​​​​
  • centos 7单机安装ceph并创建rbd块设备
  • 博世X阿里云:智能座舱接入通义大模型!
  • MYSQL进阶超详细总结2.0
  • CppCon 2017 学习:CNL: A Compositional Numeric Library
  • Zephyr 高阶实践:彻底讲透 west 构建系统、模块管理与跨平台 CI/CD 配置
  • 微信小程序-数据加密
  • 数据结构 栈与队列 6.18
  • Vue3 × DataV:三步上手炫酷数据可视化组件库
  • Matplotlib快速入门
  • 2D写实交互数字人:让AI形象拥有“真人温度“的技术革命
  • 《HTTP权威指南》 第1-2章 HTTP和URL基础
  • C#实现图片文字识别
  • 【Pandas】pandas DataFrame unstack
  • LVS+Keepalived高可用群集
  • 【请关注】真实案例pg及kong安装部署
  • CppCon 2017 学习:C++ in Academia
  • GNU Octave 基础教程(2):变量与数据类型详解(一)
  • 技术与情感交织的一生 (八)
  • Git中新创建分支是否为空?这可得视情况而定!
  • JVM-类加载机制
  • 论文笔记 <交通灯><多智能体>MetaLight:基于价值的元强化学习用于交通信号控制
  • 20.jsBridge多页面交互与原生事件监听冲突问题
  • 锂电池充电管理芯片XSP30 适用于2-3节串联锂电池升降压快速充电
  • 新发布的一款使用ReactNative新架构加载Svga动画的开源插件[android/ios]
  • 【解决方案】Java 11 报错 <javax.net.ssl.SSLException: Tag mismatch!>,Java 8 却没问题?
  • 二分K-means:让聚类更高效、更精准!