Самое простое решение - использовать локальную переменную, которая отслеживает, смонтирован ли компонент или нет.Это общий шаблон с подходом на основе классов.Вот пример , который реализует его с помощью хуков:
function Example() {
const [text, setText] = React.useState("waiting...");
React.useEffect(() => {
let isCancelled = false;
simulateSlowNetworkRequest().then(() => {
if (!isCancelled) {
setText("done!");
}
});
return () => {
isCancelled = true;
};
}, []);
return <h2>{text}</h2>;
}
Вот альтернатива с useRef
:
function Example() {
const isCancelled = React.useRef(false);
const [text, setText] = React.useState("waiting...");
React.useEffect(() => {
fetch();
return () => {
isCancelled.current = true;
};
}, []);
function fetch() {
simulateSlowNetworkRequest().then(() => {
if (!isCancelled.current) {
setText("done!");
}
});
}
return <h2>{text}</h2>;
}
Более подробную информацию об этом шаблоне вы можете найти в этой статье .Вот проблема внутри проекта React на GitHub, которая демонстрирует это решение.