javascript - 无法更新 keyDown 上的状态挂钩
问题描述
我正在尝试更新 SpaceBar 上的状态,但状态值似乎没有改变(总是打印 0)
这是我尝试过的:
import './App.css';
import { useState, useEffect} from 'react';
function App() {
const [counter, setCounter] = useState(0);
const keyHandler = () => {
switch (e.keyCode) {
case 32:
setCounter(counter + 1);
console.log(counter)
break;
}
}
useEffect(() => {
document.addEventListener("keydown", e => keyHandler(e));
}, [])
return (
<div className="App">
{counter}
</div>
);
}
export default App;
更新:
对于未来的您,请阅读有关反应中的闭包以及如何处理它们的信息,
我发现这篇文章(以及此处接受的答案)非常有用:
https ://dmitripavlutin.com/react-hooks-stale-closures/
解决方案
您的keyHandler
回调关闭了您的状态值,因此不会对更新做出反应。见关闭
const App = () => {
const [counter, setCounter] = React.useState(0);
const keyHandler = (e) => {
switch (e.keyCode) {
case 32:
setCounter((counter) => counter + 1);
break;
default:
// do nothing
}
};
React.useEffect(() => {
document.addEventListener("keydown", keyHandler);
return () => document.removeEventListener("keydown", keyHandler);
}, []);
return (
<div className="App">
<button>click me</button>
{counter}
</div>
);
};
ReactDOM.render(<App />, document. getElementById('root'))
<script src="https://unpkg.com/react@latest/umd/react.development.js" crossorigin="anonymous"></script>
<script src="https://unpkg.com/react-dom@latest/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@latest/babel.min.js" crossorigin="anonymous"></script>
<div id="root"></div>
推荐阅读
- javascript - D3.js 捆绑/组节点 n 次
- midi - 从musicxml文件中提取和弦
- c# - AWS Hello World C# Lambda 函数返回 Json 错误
- sql - 创建视图时如何循环
- c++ - 为什么它需要一个右值复制构造函数,即使它不会被调用?
- android - 如何完成一个活动并在另一个活动中指定片段?
- arrays - 使用 react js 合并并显示表中的对象数据数组
- android - 如何在示例应用程序 android 中显示 Boot Flow 消息?
- php - 实时搜索结果显示在新页面上
- azure - 如何从 Web 获取 excel 文件并将其存储在 azure blob 存储中