React useOnGlobalEvent钩子
在全局对象上发生事件时执行回调函数。
- 使用
useRef()
钩子创建一个变量listener
,用于保存监听器的引用。 - 使用
useRef()
钩子创建一个变量,用于保存type
和options
参数的先前值。 - 使用
useEffect()
钩子和EventTarget.addEventListener()
监听给定事件type
在Window
全局对象上。 - 使用
EventTarget.removeEventListener()
在组件卸载时移除任何现有的监听器并进行清理。
const useOnGlobalEvent = (type, callback, options) => {
const listener = React.useRef(null);
const previousProps = React.useRef({ type, options });
React.useEffect(() => {
const { type: previousType, options: previousOptions } = previousProps;
if (listener.current) {
window.removeEventListener(
previousType,
listener.current,
previousOptions
);
}
listener.current = window.addEventListener(type, callback, options);
previousProps.current = { type, options };
return () => {
window.removeEventListener(type, listener.current, options);
};
}, [callback, type, options]);
};
const App = () => {
useOnGlobalEvent('mousemove', e => {
console.log(`(${e.x}, ${e.y})`);
});
return <p>移动鼠标</p>;
};
ReactDOM.createRoot(document.getElementById('root')).render(
<App />
);
ReactDOM.createRoot方法用于创建一个根节点,并将根节点渲染到指定的DOM元素上。在这个例子中,我们将根节点渲染到id为"root"的DOM元素上。
注意:这段代码使用了JSX语法,需要使用Babel或类似的工具进行转换才能在浏览器中运行。