javascript - 我的反应网站在移动元素后冻结
问题描述
我是 React 的初学者,目前我想创建一辆可以在按下箭头键后移动的汽车。但是,一段时间后,该网站冻结,我什至无法打开控制台。
我的父组件
function App() {
const [move, setMove] = useState("Standing");
return (
<>
<h1 id="move">{move}</h1>
<Car currentMove={move} whereMove={setMove} />
</>
)
}
我的子组件
const Car = (props) => {
let [x, setX] = useState(50);
let [y, setY] = useState(50);
let itemStyle = {
top: y + "%",
left: x + "%",
color: "goldenrod"
}
window.addEventListener("keydown", event => startCar(event))
function startCar(event) {
console.log(event);
switch (event.keyCode) {
case 38:
setY(y - 2);
break;
case 40:
setY(y + 2);
console.log(itemStyle);
break;
case 37:
setX(x - 1);
break;
case 39:
setX(x + 1)
break;
}
}
return (
<>
<div className="car" style={itemStyle}>X</div>
</>
)
}
解决方案
您需要将 eventListener 移动到useEffect
useEffect(() => {
// on component mount
window.addEventListener("keydown", startCar)
// on component unmount
return () => {
window.removeEventListener("keydown", startCar)
}
}, [])
推荐阅读
- asp.net-core - 没有 ASP.NET Core 标识的 IdentityServer4
- python-3.x - FileNotFoundError:[Errno 2] 没有这样的文件或目录:在 jupyter 笔记本中
- swift - 根视图控制器我无法将其分配给类
- redis - 将分布式缓存数据备份到云存储
- scala - 由一元类型构造函数限制的非一元类型构造函数
- java - Android 11 包可见性问题
- c# - C# 中的程序集是否类似于 C++ 中的翻译单元?
- c++ - SDL2 不是基于 VS 代码构建的
- html - 页中块的垂直分配
- python - 简单的审查功能在 python 中不起作用