React中如何正确监听全局快捷键(比如Ctrl+K)?
我在写一个搜索功能,想用 Ctrl+K 触发聚焦到搜索框,但加了键盘事件监听后没反应,不知道是不是哪里写错了。
试过在 useEffect 里加 window.addEventListener,也试过直接在组件里绑定,但快捷键就是不触发。是不是组合键要特殊处理?
useEffect(() => {
const handleKeyDown = (e) => {
if (e.ctrlKey && e.key === 'k') {
searchInputRef.current?.focus();
}
};
window.addEventListener('keydown', handleKeyDown);
return () => window.removeEventListener('keydown', handleKeyDown);
}, []);
然后就是 Ctrl 键的状态判断,建议用 e.ctrlKey 来检测,但记得同时要阻止默认行为,不然某些浏览器可能会弹出书签管理器之类的操作。
这是个更好的写法:
另外一个小技巧是把 key 转成小写来比较,这样无论用户按的是大写还是小写 K 都能正常工作。记得这个事件监听器只依赖于组件挂载和卸载,所以保持空数组作为 useEffect 的依赖参数就行。
这种写法简洁又可靠,我也在几个项目里用过类似方案,效果不错。希望这能帮你解决问题。
keydown事件里加e.preventDefault()阻止默认行为,并确保监听在window上(别用document或某个子元素),再检查下是不是有其他库也占用了这个快捷键: