gpt4 book ai didi

javascript - 如何停止这个 React useEffect 中的无限循环?

转载 作者:行者123 更新时间:2023-12-05 04:19:56 25 4
gpt4 key购买 nike

我希望 React 从非 React 上下文呈现按键,更具体地说是字符串数组 keys:

import * as React from "react";
import { render } from "react-dom";

let keys: string[] = [];

function handleKeypress(event: any) {
keys.push(event.key);
console.log(keys);

// there will be more code here unrelated to React.
}

document.removeEventListener("keypress", handleKeypress);
document.addEventListener("keypress", handleKeypress);

function App() {
const [keysState, setKeysState] = React.useState<string[]>([]);

React.useEffect(() => {
function updateKeysState() {
setKeysState([...keys]);
}

// if you uncomment this, the code inside useEffect will run forever
// updateKeysState()

console.log("Hello world");
}, [keysState]);

return (
<div>
{keys.map((key: string, id) => (
<li key={id}>{key}</li>
))}
</div>
);
}

const rootElement = document.getElementById("root");
render(<App />, rootElement);

我几乎完成了......问题是,React.useEffect 中的代码在无限循环中运行。

我认为将 [keysState] 作为第二个参数传递给 React.useEffect 会停止无限循环。但它没有。

这是为什么以及如何解决?

在线代码:https://codesandbox.io/s/changing-props-on-react-root-component-forked-eu16oj?file=/src/index.tsx

最佳答案

最好的方法是将非 React 代码集成到应用程序中,以便通过按键设置状态是自然而微不足道的。

function App() {
const [keys, setKeys] = React.useState<string[]>([]);
useEffect(() => {
function handleKeypress(event: KeyboardEvent) {
setKeys([...keys, event.key]);
// There will be more code here that's unrelated to React.
}
document.addEventListener("keypress", handleKeypress);
return () => {
document.removeEventListener("keypress", handleKeypress);
};
}, []);

然后您可以完全放弃当前的 React.useEffect(及其无限循环)。

如果那不是一个选项,您将不得不从 React 外部触发 React 状态 setter ——无论您怎么看,这都会非常难看。我想你可以将它分配给一个外部变量:

let setKeysOuter;

function handleKeypress(event: KeyboardEvent) {
setKeysOuter?.(keys => [...keys, event.key]);
// There will be more code here that's unrelated to React.
}

function App() {
const [keys, setKeys] = React.useState<string[]>([]);
setKeysOuter = setKeys;

关于javascript - 如何停止这个 React useEffect 中的无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74609238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com