我想创建一个包含所有按下的键的状态。
function App() {
const [inputArray, setInputArray] = useState(["After me should be a list of keys: "]);
function keyDownListener(e){
console.log(`Key: ${e.key} with keycode ${e.keyCode}. Array: ${inputArray} `);
let clonedArray = [...inputArray];
clonedArray.push(e.key);
setInputArray(clonedArray);
}
useEffect(() => {
document.addEventListener('keydown', keyDownListener);
}, []);
return (
<div className='app' >
{inputArray}
</div>
);
}
但由于某种原因,它总是只有一个最后按下的键,虽然我尝试了很多方法来更新状态,结果总是一样的。所以输出总是像这样:me之后应该是一个键列表:Alt它确实对我按下按键有反应,但它总是只显示一个键,而不是像这样添加新的键:在我之后应该是一个键列表:AltAltAltAlt
将函数更新为
function keyDownListener(e) {
console.log(`Key: ${e.key} with keycode ${e.keyCode}. Array: ${inputArray} `);
setInputArray(prevArray => [...prevArray, e.key]);
}
你的useEffect缺少一个依赖项(keyDownListener),所以它总是引用第一个keyDownListener(它本身引用第一个inputArray)。
你可以这样解决你的问题,例如:
useEffect(() => {
function keyDownListener(e){
console.log(`Key: ${e.key} with keycode ${e.keyCode}. Array: ${inputArray} `);
let clonedArray = [...inputArray];
clonedArray.push(e.key);
setInputArray(clonedArray);
}
document.addEventListener('keydown', keyDownListener);
return () => document.removeEventListener('keydown', keyDownListener);
}, [inputArray]);