- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将事件监听器添加到 React 中的图标,但它不起作用。我的代码:
const handleKey = (event) => {
console.log(event);
}
<MdOutlinePause onKeyDown={handleKey} />
我在同一个按钮上还有一个 onClick 处理程序,它运行良好,所以我真的很困惑为什么 onKeyDown 没有触发。感谢任何人可以提供的任何帮助!
最佳答案
在特定元素上使用 onKeyDown 需要焦点才能按预期工作。
我们可以通过添加 tabindex 使您的 MdOutlinePause
组件可聚焦属性。这将允许您通过点击选项卡或单击它来为图标提供焦点。该元素看起来像这样:
<MdOutlinePause tabIndex={0} onKeyDown={handleKey} />
如果您希望无需聚焦元素即可检测键事件,您需要附加一个事件监听器。我们可以用 useEffect 来做到这一点所以这发生在 Mount 上,我们会将事件监听器附加到 window
,这样无论哪个元素具有焦点,它都能正常工作:
/// Don't copy and paste this - see below
useEffect(() => {
window.addEventListener("keydown", handleKeyPress);
});
}, []);
/// Don't copy and paste this - see below
这允许您检测键盘事件,这很好,但有一个问题:每当页面加载时 eventListener 会再次添加,但永远不会被删除。因此,您可能会遇到函数在每次按键时被多次调用的问题。
我们可以通过删除 return from useEffect 中的事件监听器来解决这个问题.这就是我们如何指定一个函数让 useEffect
清理 自身。这确保了我们的 useEffect
永远不会一次添加多个“keydown”事件监听器:
useEffect(() => {
window.addEventListener("keydown", handleKeyPress);
return () => {
window.removeEventListener("keydown", handleKeyPress);
};
}, []);
这是完整的 example on codesandbox
如果您不需要在 handleKeyPress
函数中访问状态,这会非常有用。
这是一个常见的用例,当用户执行某个操作时需要对状态变量做一些事情,如果我们需要访问更新后的状态,那么我们就会遇到一个问题:我们附加了 handleKeyPress
到事件监听器 onMount 并且该函数永远不会更新,因此它将始终使用状态的初始版本。 This codesandbox说明了这个问题。
我们可以通过将 handleKeyPress
添加到 useEffect 的依赖项数组来解决这个问题,但这会导致我们的事件监听器被删除并在每次渲染时重新添加,因为 handleKeyPress
将在每个渲染器上更新。更好的解决方案是使用 callback pattern 与我们的 handleKeyPress
以便它只在实际需要时更新(当它依赖的状态被更新时)。我们还想将 handleKeyPress
添加到我们的 useEffect
依赖项数组中,以便在 handleKeyPress
函数更改时创建一个新的事件监听器:
const handleKeyPress = useCallback((event) => {
// do stuff with stateVariable and event
}, [stateVariable]);
useEffect(() => {
window.addEventListener("keydown", handleKeyPress);
return () => {
window.removeEventListener("keydown", handleKeyPress);
};
}, [handleKeyPress]);
现在一切都适本地更新了! Here's a full example这个在 codesandbox 上。
还有一种解决方案可以让您以最简单的方式访问状态。缺点是您唯一可以访问的状态变量(具有更新的值)将是您正在更新的状态变量,因此此解决方案是视情况而定的。要访问其他状态变量,您必须使用上述解决方案。
通过 passing a function对于 useState,我们可以访问前一个状态作为函数的第一个参数。这允许采用更简单的方法,如下所示和 this codesandbox 中所示。 .
const [text, setText] = useState("");
const handleKeyPress = event => {
setText(previousText => `${previousText}${event.key}`);
};
useEffect(() => {
window.addEventListener("keydown", handleKeyPress);
return () => {
window.removeEventListener("keydown", handleKeyPress);
};
}, []);
关于javascript - React 中的 onKeyDown/onKeyUp 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71822354/
德尔福2010 我在主窗体上使用 OnFormKeyDown 事件,并且基本上在对话框上使用相同的事件 //主窗体 procedure TfrmMain.FormKeyDown(Sender: TOb
我在网上看到的大部分代码都使用了document.onkeydown,但是MDN只列出了window.onkeydown . This comment还建议使用 window.onkeydown。使用
我在线性布局中放置了一个 ListView ,我想覆盖 ListView 中的 onkeydown() 方法,我不控制焦点,只是改变onkeydown()中的一些变量,我希望系统像我没有覆盖onkey
我想知道如何使用事件监听器在 javscript 中正确使用 onkeydown 和 onkeyup 事件。我希望在您只需在网站中而不是在文本字段中按下时监听该事件。 我不确切地知道脚本会是什么样子,
我在从数字键盘输入数字值时遇到问题。我的脚本仅接受“qwerty”键上方数字键的数字。我想要的是用户还可以从数字键盘输入数字。以下是 HTML: 但是我尝试在 onkeypress 和
我不知道这个问题是否已经在某个地方得到了回答,但就是这样。 为什么会这样? el.onkeydown = function(e) { if(!((e.keyCode > 95 && e.keyCo
我不知道这个问题是否已经在某个地方得到了回答,但就是这样。 为什么会这样? el.onkeydown = function(e) { if(!((e.keyCode > 95 && e.keyCo
我在 if 语句中使用 var "str"时遇到问题。我知道这是一个范围问题,但我不知道如何解决它。我已经失败了好几次了。 我的目标是在 if 语句中使用“str”的值来显示或不显示警报。限制是我只能
当用户在 Android 中按下后退按钮时,我会出现一个自定义对话框,询问“您确定吗”。问题是,如果我实现 onKeyDown 方法,音量硬按钮就不起作用,并且音量不会升高或降低(在整个 Activi
我正在编写代码,以在按下音量调高/调低键时更改 TextView,以更新系统音量%设置的 TextView。我现在有这段代码,该代码可以工作一次,但它会覆盖调高/调低的功能,是有没有办法重写它或排除它
使用Material-UI Table我有这个: console.log(event)}> ... 当我用鼠标单击表格,然后开始单击向上和向下箭头键时,控制台上没有任何记录。我
设置左右箭头键图像导航脚本时遇到问题 document.onkeydown = function(event) { var e = event || wind
在我的旧项目中,我在 winform TextBox 中使用了 OnKeyPress 的覆盖来替换一些输入键 if(e.KeyChar == 'a') e.KeyChar = 'b'; // j
function Test(event) { console.log(event.key + ' ' + event.which + ' ' + event.code); } 结果: undef
这是我的代码 document.onkeydown = function (a) { if (a.which == 13) { alert("Not Anymore");
我正在处理一个表单并尝试创建一个执行以下操作的 onkeydown 函数: 仅在按下 tab 键 时触发(正常工作) 插入一个新元素(input)(一切正常) 然后插入的 input 调用相同的 on
我有一个无法识别第一次按键的 onKeyDown 事件(甚至无法进入该事件,我已经通过生成“toast”输出进行了测试)。在第二次按键和之后,它完美地工作。如果我点击屏幕上的另一个元素并再次尝试按键,
在我的应用程序中,我尝试覆盖 onKeyDown 方法并调用自定义对话框,但是当在设备上运行时,它没有显示该自定义对话框。我使用了调试器并看到调用了 onKeyDown 方法,但没有出现对话框并且应用
这个问题在这里已经有了答案: Override home and back button is case a boolean is true (6 个答案) 关闭 8 年前。 我覆盖了 Activi
public boolean onKeyDown(int keyCode, KeyEvent event) { } 此方法中的代码仅在选定的 EditText 具有退格键条目时触发。我需要它被任何类型
我是一名优秀的程序员,十分优秀!