如何在弹窗打开时只监听局部快捷键?
我在页面里有个 Modal 弹窗,想让它打开时按 Esc 能关闭,但又不影响页面其他地方的全局快捷键。现在的问题是,不管弹窗开没开,按 Esc 都会触发关闭逻辑。
我试过在弹窗组件里用 useEffect 加事件监听,但好像还是会和全局的冲突。比如这样:
useEffect(() => {
const handleEsc = (e) => {
if (e.key === 'Escape') closeModal();
};
window.addEventListener('keydown', handleEsc);
return () => window.removeEventListener('keydown', handleEsc);
}, []);
结果一按 Esc,不仅弹窗关了,页面上其他监听 Escape 的功能也触发了。怎么才能让快捷键只在弹窗“聚焦”或“激活”时生效?
首先修改你的 useEffect 逻辑,在添加事件监听前做个校验:
这里要注意的是,别忘了在弹窗关闭后移除事件监听器,不然容易产生内存泄漏。另外,如果页面有多个弹窗,每个弹窗最好用不同的状态变量来控制,避免相互影响。
最后提醒一句,处理键盘事件时要小心,特别是涉及到系统级按键(比如 Ctrl+Alt+Delete 这种组合)。虽然在这个场景下不涉及,但写代码时还是要养成安全意识,考虑边界情况。有时候用户会同时按多个键,适当做些防抖处理也不是坏事。
pre class="pure-highlightjs line-numbers">
useEffect(() => {const handleEsc = (e) => {
if (e.key === 'Escape' && isModalOpen) closeModal();
};
window.addEventListener('keydown', handleEsc);
return () => window.removeEventListener('keydown', handleEsc);
}, [isModalOpen]);
确保 isModalOpen 是控制弹窗显示状态的变量。