驯服 React 里的 DOM 事件:useEventListener、useEventEmitter、useKeyModifier、useTextSelectDOM 事件模型和 React 的渲染模型本来就不太处得来。addEventListener 想要一个稳定的函数引用,但 React 每次渲染都给你一个新的闭包。setTimeout 撑起来的 debounce 想活到下一帧,而 React 在定时器还没跑完的时候就把组件卸了。键盘告诉你某个键按下、再告诉你它松开,可如果用户中间 alt-tab 切走了,松开事件就不会再来,你那个"Shift 还按着"的标志就永远是 true。Selection API 更绝——selectionchange 在同一个 S