【发布时间】:2022-11-29 00:33:41
【问题描述】:
我正在 React 组件中收听 keypress:
import * as React from "react";
import { render } from "react-dom";
function App() {
const [keys, setKeys] = React.useState<string[]>([]);
React.useEffect(() => {
const handleKeypress = (event: any) => {
if (event.key !== "]" && event.key !== "[" && event.key !== "Enter") {
setKeys([...keys, event.key]);
console.log(keys)
// if you pressed, say, `d`, this should log `['d']`,
// but it logs `[]` instead.
}
// do something with keys
};
document.addEventListener("keypress", handleKeypress);
return () => {
document.removeEventListener("keypress", handleKeypress);
};
}, [keys]);
return (
<div>
{keys.map((key: string, idx) => (
<li key={idx}>{key}</li>
))}
</div>
);
}
const rootElement = document.getElementById("root");
render(<App />, rootElement);
奇怪的事情发生了。 console.log(keys) 将在您第一次按下某个键时记录一个空数组……但该键将显示在 JSX 中。
为什么是这样?以及如何更改代码,以便console.log(keys) 不会在您第一次按键时记录一个空数组?keys一改我就想用。
直播码:https://codesandbox.io/s/changing-props-on-react-root-component-forked-bjqsxe?file=/src/index.tsx
【问题讨论】:
标签: reactjs typescript