[ PROMPT_NODE_27908 ]
advanced-event-handler-refs
[ SKILL_DOCUMENTATION ]
## 将事件处理器存储在 Refs 中
当 Effect 不应在回调函数变更时重新订阅时,请将回调函数存储在 refs 中。
**错误示例(每次渲染都会重新订阅):**
tsx
function useWindowEvent(event: string, handler: () => void) {
useEffect(() => {
window.addEventListener(event, handler)
return () => window.removeEventListener(event, handler)
}, [event, handler])
}
**正确示例(稳定的订阅):**
tsx
function useWindowEvent(event: string, handler: () => void) {
const handlerRef = useRef(handler)
useEffect(() => {
handlerRef.current = handler
}, [handler])
useEffect(() => {
const listener = () => handlerRef.current()
window.addEventListener(event, listener)
return () => window.removeEventListener(event, listener)
}, [event])
}