useEffect と ReactStrictMode の使用: パフォーマンスと信頼性のために React コンポーネントを最適化する
<p>課題があります。コンポーネントは非常に重いため、配列の一部を「loadedData」という新しい配列にロードし、ロードされたデータのみを表示したいと考えています。 </p>
<p>しかし、useEffect が台無しになっているようで、最初のロード時に多くの問題に遭遇しました。最初のロードは 2 回行われ、最初のデータはレンダリングごとに 1 回配列にプッシュされます。 「reactStrictMode」を削除すると期待どおりに機能しますが、その結果を理解せずに「不正行為」をしたくありません。私よりも問題をよく理解している人が、理由があってこの問題をそこに置いたのです。 </p>
<p>isLoading 状態では、初期ロード中の 2 回目の実行を防ぐことはできません。これは、この問題に関連する他のスレッドで私が受け取った提案です。 </p>
<p>最初の useEffect が isLoading 状態を無視する理由とそれに対処する方法を知っている人はいますか? </p>
<pre class="brush:php;toolbar:false;">// 表示されている部分をロードしようとしますが、それ以上はロードしないでください
const [loadedData, setLoadedData] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const addMoreData = async () => {
if (loadedData.length >= data.length) return;
const startIndex = ロードされたデータ.長さ;
constpreferredLoadLength = 1;
const endIndex = startIndexpreferredLoadLength;
const newData = data.slice(startIndex, endIndex);
setLoadedData((prev) => [...prev, ...newData]);
};
// データをマウントしてフェッチした後、テーブルが一番下までスクロールされており、すぐにさらにデータをフェッチする必要があるかどうかを確認します
useEffect(() => {
const {scrollHeight、scrollTop、clientHeight} = tableContainerRef.current;
もし (
スクロールハイト == クライアントハイト &&
スクロールトップ == 0 &&
ロードされたデータの長さ < データの長さ
) {
const addNewDataFunction = async () => {
if (isLoading) {
戻る;
}
setIsLoading(true);
addMoreData() を待ちます;
setIsLoading(false);
};
addNewDataFunction();
}
// eslint-disable-next-line 反応フック/網羅的-deps
}, [data.length、loadedData.length、isLoading]);</pre>
<p><br /></p>