3 回答

TA贡献1817条经验 获得超6个赞
新答案:
useEffect(() => {
function handlekeydownEvent(event) {
const { key, keyCode } = event;
if (keyCode === 32 || (keyCode >= 65 && keyCode <= 90)) {
setUserText(prevUserText => `${prevUserText}${key}`);
}
}
document.addEventListener('keyup', handlekeydownEvent)
return () => {
document.removeEventListener('keyup', handlekeydownEvent)
}
}, [])
使用时setUserText,将函数作为参数而不是对象作为参数传递,prevUserText它将始终是最新状态。
旧答案:
试试看,它的工作原理与您的原始代码相同:
useEffect(() => {
function handlekeydownEvent(event) {
const { key, keyCode } = event;
if (keyCode === 32 || (keyCode >= 65 && keyCode <= 90)) {
setUserText(`${userText}${key}`);
}
}
document.addEventListener('keyup', handlekeydownEvent)
return () => {
document.removeEventListener('keyup', handlekeydownEvent)
}
}, [userText])
因为在您的useEffect()方法中,它取决于userText变量,但是您不要将其放在第二个参数内,否则,userText将始终将参数绑定到''带有arguments的初始值[]。
您不需要这样做,只想让您知道第二个解决方案为何不起作用。
添加回答
举报