github: https://github.com/Misaka-0x447f/createTypedEvent
npm: https://www.npmjs.com/package/@misaka17535/create-typed-event
相比其他事件库,首先是带类型,让用户能知道 payload 的类型;其次是函数式,不再需要手敲事件名。然后是 sub 函数自动返回 unsub 函数,不再必须传入 sub 时的 listener:
const misakaStateChange = createTypedEvent<{ selfDestructionInProgress: boolean }>()
// returns unsub function without defining handler outside
const unsub = misakaStateChange.sub((payload) => console.log(payload))
misakaStateChange.dispatch({selfDestructionInProgress: true})
unsub()
>>> { selfDestructionInProgress: true }
另外还自带 react hook ,完美桥接 react 响应式变量,如果你想你也可以轻松写出其他响应式框架的版本。
是新包,但是已经在各种内部项目里用了两三年了,用过的同事都说好。
![]() |
1
maocat 1 天前 via Android
额,试试加个异步?
|
![]() |
2
xiaolingxinna OP @maocat 天然支持异步?
|
![]() |
3
xiaolingxinna OP 咦,现在 V2EX 不支持附言了?刚刚写了一下相比其他库的优势:
- rxjs - 面向对象:需要你创建一个 Observable/Subject 对象。 - 包体积很大: [email protected] 本身就有 4.29MB ,而这个库只有 12.5KB (未来可能会更小)。 - mitt - 需要你写事件名:`emitter.on('xxx'...` - 不返回取消订阅方法。 - 不支持获取当前值。 |
4
Lush 1 天前
支持字符串事件名不是更通用吗,大部分需要发布订阅的场景都是为了解耦,如果一个事件一个变量不就又要 import ,模块之间又耦合了
|
![]() |
5
zthxxx 1 天前
@xiaolingxinna 发包名字太长了影响传播,建议换个名字
|
![]() |
6
akirarika 1 天前
已 star~
|
![]() |
7
nzbin 1 天前
@xiaolingxinna RxJS 4M 那是 npm 包的体积,不是代码引入的大小,你应该看看 dist 目录里面的 esm 包,而且 RxJS 不只是做事件驱动,而是完整的异步解决方案
|
8
3085570450tt 1 天前
nanoevents: https://github.com/ai/nanoevents, 都有你提到的功能,同时体积还比你小?
|