codesandboxを確認してください:https://codesandbox.io/s/bold-hamilton-k1nzs
コードを実行すると、無限ループが発生します。コンソールをチェックして、エントリが指数関数的にどのように増加するかを確認できます。そして最終的にウェブサイトがクラッシュします。
私はこのような状態変数を持っています:
const [checkbox, setCheckBox] = useState({});
次に、useEffect内の関数を呼び出しています。
useEffect(() => {
createCheckbox();
});
これはcreateCheckbox関数です。
const createCheckbox = () => {
let checkboxObj = {};
rows.forEach((e) => {
checkboxObj[e.id] = false;
});
setCheckBox(checkboxObj);
};
問題を紹介するために、76行目にconsole.logがあります。console.log(チェックボックス)です
何が起こっているのか考えていますか?
useEffect(() => {
createCheckbox();
});
useEffect
それはコンポーネントをレンダリングするたびに実行されますので、フックには依存していない、とフックのコールバックが、最終的に状態を更新するので、それは別のレンダリングサイクルをトリガします。すすぎ、繰り返し、吐き気を催します(つまり、レンダリングのループ)。
基本的に、最初のロード時にチェックボックスを空/ falseとして初期化します。
useEffect
空の依存関係配列を使用して、コンポーネントのマウント時にエフェクトを1回実行できます。
useEffect(() => {
createCheckbox();
}, []);
または、useState
フックで遅延状態初期化関数を使用します。
const [checkbox, setCheckBox] = useState(() => {
let checkboxObj = {};
rows.forEach((e) => {
checkboxObj[e.id] = false;
});
return checkboxObj;
});
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加