Состояние обновления в функциональных компонентах по-прежнему асинхронное, попробуйте использовать синтаксис функциональное обновление , чтобы «поставить в очередь» обновления.
useEffect(() => {
fetch("some api", { method: "GET" })
.then(res => res.json())
.then(
res => {
setState(prevState => ({
...prevState,
isLoaded: true,
response1: res
}));
},
error => {
setState(prevState => ({
...prevState,
isLoaded: false,
error: error
}));
}
);
fetch("another api", {
method: "GET"
})
.then(res => res.json())
.then(
res => {
setState(prevState => ({
...prevState,
response2: res,
isLoaded2: true
}));
},
error => {
setState(prevState => ({
...prevState,
error: error
}));
}
);
}, []);
То, что происходит, даже если есть несколько Устанавливать возникающие состояния, когда они обрабатываются, все они ссылаются на одно и то же значение состояния из предыдущего цикла рендеринга.
const [count, setCount] = useState(0);
const plus3Update = () => {
setCount(count + 1); // count === 0
setCount(count + 1); // count === 0
setCount(count + 1); // count === 0
// count === 1 now
};
const plus3FunctionalUpdate = () => {
// using a different name to not be confused with state value
setCount(c => c + 1); // count === 0, then 1
setCount(c => c + 1); // count === 1, then 2
setCount(c => c + 1); // count === 2, then 3
// count === 3
};
Демонстрация, показывающая как обновление, так и функциональное обновление состояния обновления состояния.