J'ai rencontré un problème où React ne regroupe pas les appels setState() multiples à l'intérieur d'une fonction asynchrone (React le fait habituellement automatiquement en dehors d'une fonction asynchrone). Cela signifie que lorsque mon code est exécuté, plusieurs appels setState() consécutifs entrent en conflit les uns avec les autres, le premier setState() entraîne la mise à jour du composant et le second setState() se produit avant que le composant n'ait eu le temps de remonter et je reçois l'erreur "Can't perform a React state update on an unmounted component". J'ai fait quelques recherches et j'ai découvert que c'est un comportement attendu, mais je n'ai rien trouvé sur la façon de résoudre ce problème.
Voici un exemple de code (qui ne s'exécute pas) pour visualiser ce que j'essaie de dire. Dans ce cas, les lignes setData(response.data) ; et setLoading(false) ; entrent en conflit et provoquent l'erreur.
J'ai besoin d'un moyen de rendre les deux appels atomiques.
import React, { useState } from "react";
import Button from "@material-ui/core/Button";
const Demo = () => {
const [loading, setLoading] = useState(false);
const [data, setData] = useState({});
const fetchData = async () => {
setLoading(true);
const response = await callAPI();
if (response.status === 200) {
setData(response.data);
}
setLoading(false);
};
return (
<div>
<Button disabled={loading} onClick={() => fetchData()}>
Fetch Data
</Button>
<p>{JSON.stringify(data)}</p>
</div>
);
};
export default Demo;