Mah*_*esh 1 javascript reactjs react-hooks
考虑这个片段,
useEffect(() => {
document.addEventListener('mousedown', checkAndCloseMenu);
return () => document.removeEventListener('mousedown', checkAndCloseMenu);
}, []);
Run Code Online (Sandbox Code Playgroud)
我在高阶下拉组件中使用此 useEffect,我见过很少专业人士使用此类添加和删除事件侦听器。使用这些事件监听器是反模式吗?如果是,正确的方法是什么。
添加和删除事件侦听器不被视为反模式。
useEffect(() => {
document.addEventListener('mousedown', checkAndCloseMenu);
return () => document.removeEventListener('mousedown', checkAndCloseMenu);
}, []);
Run Code Online (Sandbox Code Playgroud)
无论何时何地,最好使用 React ref 来访问底层 DOMNode:
const ref = React.useRef();
useEffect(() => {
const node = ref.current;
node.addEventListener('mousedown', checkAndCloseMenu);
return () => node.removeEventListener('mousedown', checkAndCloseMenu);
}, []);
...
<div ref={ref}> ..... </div>
Run Code Online (Sandbox Code Playgroud)
或者直接附加监听器
<div onMouseDown={checkAndCloseMenu}> ..... </div>
Run Code Online (Sandbox Code Playgroud)
但有时,当您需要监听来自对象/节点的事件时,这是不可避免window的document。
被认为是反模式的是直接改变全局事件监听器。
document.onmousedown = checkAndCloseMenu;
Run Code Online (Sandbox Code Playgroud)
这样做不仅会改变全局对象,还会替换其中的任何现有值。不要像这样进行事件处理。
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |