撸了个 hook 来实现组件间 state 共享

426 阅读1分钟

目前 react 领域比较流行的状态管理工具有 redux,但是 redux 的复杂性高,在很多场景可能并不是最优选择。所以为了能在轻量级项目中抛弃 redux 并实现更简单的状态管理,笔者参考了 flutter 领域里的一些实现,撸了个轻量级的轮子来实现组件间 state 共享:

github.com/nekocode/us…

这个库目前:

  • 有完整的单元测试
  • 已在生产环境中测试
  • 已被数位大佬 star(可查看 stargazers 列表),未来可能被应用于几个流行应用

特点

  • 轻量级,比 redux 简单,可以在组件、库工程里使用
  • 体积小,gzip 之后不足 1000 字节
  • 最小范围的重新渲染。例如下图 b 和 e 共享 state,当 state 值变化时只重新渲染 b 和 e:
  a
+-+-+
| | |
b c d
    |
    e
  • 允许在 state 值指定字段发生变化时才重新渲染组件:
// 获取共享的 state,且在 age 字段发生变化时才更新被 hook 的组件
const [state, setState] = useSharedState(UserContext, (current, prev) => current?.age !== prev?.age);

核心原理

  • shared state 设计为 notifier 模式
  • 使用 context hook 来在组件间共享 shared state
  • useSharedState 的 hook 实现自动注册/反注册 listener

更详细的细节可以查看源码获得,总共只有 100 行不到的代码。