React useEventListener钩子
在给定元素上添加指定事件类型的事件监听器。
- 使用
useRef()
钩子创建一个引用,用于保存handler
。 - 使用
useEffect()
钩子在handler
发生变化时更新savedHandler
引用的值。 - 使用
useEffect()
钩子在给定元素上添加事件监听器,并在卸载时进行清理。 - 省略最后一个参数
el
,默认使用Window
。
const useEventListener = (type, handler, el = window) => {
const savedHandler = React.useRef();
React.useEffect(() => {
savedHandler.current = handler;
}, [handler]);
React.useEffect(() => {
const listener = e => savedHandler.current(e);
el.addEventListener(type, listener);
return () => {
el.removeEventListener(type, listener);
};
}, [type, el]);
};
const MyApp = () => {
const [coords, setCoords] = React.useState({ x: 0, y: 0 });
const updateCoords = React.useCallback(
({ clientX, clientY }) => {
setCoords({ x: clientX, y: clientY });
},
[setCoords]
);
```javascript
useEventListener('mousemove', updateCoords);
return (
<p>鼠标坐标:{coords.x},{coords.y}</p>
);
};
ReactDOM.createRoot(document.getElementById('root')).render(
<MyApp />
);