How to detect keydown anywhere on page in a React app?(如何在Reaction应用程序中检测页面上任何位置的按键?)
本文介绍了如何在Reaction应用程序中检测页面上任何位置的按键?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试在使用Reaction构建的应用程序中检测页面上任何位置的按键。
我记得在jQuery中很容易,但我想看看是否可以在Reaction中完成。我不想做一个‘科学怪人’项目,也就是说,如果完全可以避免的话,在Reaction中有一些部分,在jQuery中有一些部分。
到目前为止:
export default function App() {
const handleKeyPress = (event) => {
console.log(event.keyCode);
}
return (
<div
onKeyDown={handleKeyPress}
tabIndex="0"
>
<Header page_num={100}/>
</div>
);
}
但它似乎只有在用户单击页面中的实际div,然后按下某个键时才起作用。
我希望检测到按键,而无需用户在页面上的任何位置单击。
推荐答案
您可以使用useEffect
钩子来实现这一点,并向document
添加事件监听器:
import React, { useEffect } from "react";
export default ({ name }) => {
useEffect(() => {
function handleKeyDown(e) {
console.log(e.keyCode);
}
document.addEventListener('keydown', handleKeyDown);
// Don't forget to clean up
return function cleanup() {
document.removeEventListener('keydown', handleKeyDown);
}
}, []);
return <div>Keydown</div>;
};
这是一个正在运行的example。
假设<div>
通过tabindex
或类似方式聚焦,您将能够在键盘按下处理程序中看到e.target
将是<div>
。您还可以将该功能包装在另一个组件中,并在其Keydown处理程序中使用contains检查是否在该元素上执行了Keydown,而不是在外部执行。
下面是另一个example,它使用contains
检查事件目标是否在div中ref
:
import React, { useEffect, useRef } from "react";
function Hello({ onKeyDown }) {
const ref = useRef();
useEffect(() => {
function handleKeyDown(e) {
// check if keydown was contained in target div
if (!ref.current || ref.current.contains(event.target)) {
return;
}
// Emit event to parent component
onKeyDown(e);
}
document.addEventListener("keydown", handleKeyDown);
return function cleanup() {
document.removeEventListener("keydown", handleKeyDown);
};
}, []);
return (
<div ref={ref} tabIndex="0">
foo bar baz
</div>
);
}
export default Hello;
希望这会有帮助!
这篇关于如何在Reaction应用程序中检测页面上任何位置的按键?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:如何在Reaction应用程序中检测页面上任何位置的按
基础教程推荐
猜你喜欢
- Electron 将 Node.js 和 Chromium 上下文结合起来意味着 2022-01-01
- 如何使用JIT在顺风css中使用布局变体? 2022-01-01
- 直接将值设置为滑块 2022-01-01
- Vue 3 – <过渡>渲染不能动画的非元素根节点 2022-01-01
- 用于 Twitter 小部件宽度的 HTML/CSS 2022-01-01
- Chart.js 在线性图表上拖动点 2022-01-01
- 自定义 XMLHttpRequest.prototype.open 2022-01-01
- 如何使用TypeScrip将固定承诺数组中的项设置为可选 2022-01-01
- 我可以在浏览器中与Babel一起使用ES模块,而不捆绑我的代码吗? 2022-01-01
- html表格如何通过更改悬停边框来突出显示列? 2022-01-01