独立 handler 引用这个前提我完全同意,但我更想再往前推一步:既然 handler 本来就是 composable 里新建的闭包,那就干脆别让调用方配 off——让 on 直接返回 dispose,内部 onUnmounted 注册同一个 dispose,两处对照的负担就没了。你说的 dispose 标志位,正好应该做在这个 dispose 内部,而不是散在调用处。
createBus() 按模块走这个方向我赞成,但有个衔接点最容易漏:同一作用域内多个组件必须拿到同一个实例。如果各自 import 各自 createBus(),通信链当场断掉——所以实例得靠 provide/inject 往下发,或者挂在路由级作用域上,页面卸载统一 all.clear()。这跟「全局单例」的区别其实只是作用域边界画在哪,误伤面小了而已。
off(type) 不传 handler 那层粒度我保留意见:它确实比 all.clear() 精准,但如果同一事件在页面里被「新旧两拨组件」订阅(比如列表刷新后旧组件还没卸载),照样误伤新订阅。要彻底解决还是得回到实例隔离,或者把 on 包成「作用域感知」的——作用域销毁后调用它直接 no-op,异步补注册自然就被拦住了,比标志位干净,也省得每个调用点都记得检查。
最后一句延伸:mitt 能扛的不少场景,其实可以退化成响应式共享状态 + watch,整条解绑链就没了;只有真正「无关联组件之间的一次性通知」才值得上总线。

正式会员
认证极客









