Я создаю приложение React. js, которое имеет 2 компонента - основной из них является контейнером для 2-го и отвечает за получение информации из веб-API и затем передает ее дочернему компоненту, который отвечает за отображение информации в списке элементов. Предполагается, что отображающий компонент представляет счетчик загрузки при ожидании элементов данных от родительского компонента.
Проблема в том, что когда приложение загружается, я сначала получаю пустой список элементов, а затем все внезапно вся информация загружается в список без отображения счетчика. Сначала я получаю фильтр в одном из useEffects
и на основе этой информации привожу сами элементы.
Родитель делает что-то вроде этого:
useEffect(() =>
{
async function getNames()
{
setIsLoading(true);
const names = await WebAPI.getNames();
setAllNames(names);
setSelectedName(names[0]);
setIsLoading(false);
};
getNames();
} ,[]);
useEffect(() =>
{
async function getItems()
{
setIsLoading(true);
const items= await WebAPI.getItems(selectedName);
setAllItems(items);
setIsLoading(false);
};
getTenants();
},[selectedName]);
.
.
.
return (
<DisplayItems items={allItems} isLoading={isLoading} />
);
И дочерние компоненты делают что-то вроде этого:
let spinner = props.isLoading ? <Spinner className="SpinnerStyle" /> : null; //please assume no issues in Spinner component
let items = props.items;
return (
{spinner}
{items}
)
Я предполагаю, что проблема в том, что setEffect
является асинхронным, поэтому компонент сначала загружается с isLoading
false, а затем все действие of setEffect
вызывается перед фактическим изменением состояния? Поскольку здесь я предполагаю, что сначала я устанавливаю isLoading
, затем выполняется повторная визуализация, а затем мы переходим к остальной части кода на useEffect. Не уверен как правильно сделать