Verwenden von useEffect und ReactStrictMode: Optimieren von React-Komponenten für Leistung und Zuverlässigkeit
P粉739706089
2023-08-18 16:06:50
<p>Ich stehe vor einer Herausforderung: Ich möchte einen Teil des Arrays in ein neues Array namens „loadedData“ laden und nur die geladenen Daten anzeigen, da die Komponente sehr schwer ist. </p>
<p>Beim ersten Laden stieß ich jedoch auf viele Probleme, weil useEffect es scheinbar durcheinander brachte. Der erste Ladevorgang erfolgt zweimal und die ersten Daten werden bei jedem Rendern einmal in das Array übertragen. Wenn ich „reactStrictMode“ entferne, funktioniert es wie erwartet, aber ich möchte nicht „schummeln“, ohne die Konsequenzen zu verstehen. Jemand, der das Problem besser versteht als ich, hat es aus einem bestimmten Grund dort platziert. </p>
<p>Der isLoading-Status kann eine zweite Ausführung während des ersten Ladevorgangs nicht verhindern – dies ist ein Vorschlag, den ich in anderen Threads zu diesem Problem erhalten habe. </p>
<p>Weiß jemand, warum der erste useEffect den isLoading-Status ignoriert und wie man damit umgeht? </p>
<pre class="brush:php;toolbar:false;">// Versuchen Sie, den sichtbaren Teil zu laden, aber laden Sie nicht mehr
const [loadedData, setLoadedData] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const addMoreData = async () =>
if (loadedData.length >= data.length) return;
const startIndex = geladeneDaten.länge;
constPreferredLoadLength = 1;
const endIndex = startIndex + PreferredLoadLength;
const newData = data.slice(startIndex, endIndex);
setLoadedData((prev) => [...prev, ...newData]);
};
// Überprüfen Sie, ob die Tabelle nach dem Mounten und Abrufen von Daten nach unten gescrollt wurde und sofort weitere Daten abrufen muss
useEffect(() => {
const { scrollHeight, scrollTop, clientHeight } = tableContainerRef.current;
Wenn (
scrollHeight == clientHeight &&
scrollTop == 0 &&
geladene Datenlänge <
) {
const addNewDataFunction = async () =>
if (isLoading) {
zurückkehren;
}
setIsLoading(true);
Warten Sie auf addMoreData();
setIsLoading(false);
};
addNewDataFunction();
}
// eslint-disable-next-line reagieren-hooks/exhaustive-deps
}, [data.length, geladeneDaten.länge, isLoading]);</pre>
<p><br /></p>
你可以在
addMoreData
函数中简单地更改这一行为
这将使状态根据当前渲染时的值进行更新,因为第二次
useEffect
运行时组件尚未重新渲染,所以第一个组件所做的更改尚未反映出来,因此loadedData
尚未更新。当你使用函数形式进行更新时,
prev
是状态的实时值,在开发中使用严格模式时,你会遇到这种情况是正常的。最后,摆脱
isLoading
,它不会帮助修复这个问题。注意:在启用严格模式时,使用setState的函数形式更加推荐,但在
useEffect
中不推荐使用,因为当组件挂载时,这个钩子会运行两次。此外,当你在依赖数组中包含
data.length
和loadedData.length
时,这将使useEffect
在这些值中的任何一个发生变化时都会触发。