Другой подход к более эффективному использованию компонентов React
, основанный на комментарии авторов
there could be 200+ systems, with each system having 1 and up to 50 planets
Вместо циклического перебора функций и наличия одного глобального состояния для загрузки рассмотрите возможность разделения на компоненты.
Концептуально нам нужны три компонента
- Системы - загрузка всех систем и отображение всех систем
- Система - загрузка всех планет из систем и отображения планет
- Планета- Показать содержимое планеты
Давайте продолжим и внедрим их
- Системы
function Systems({ id }) {
const [systems, setSystems] = useState([]);
useEffect(() => {
const getSystems = async () => {
const response = await fetch(
`https://localhost:44389/api/systemlist/GetSystems/${id}`,
);
const data = await response.json();
setSystems(Object.values(data));
};
getSystems();
}, [id]);
return (
<table>
{systems.map((system) => (
<System system={system} />
))}
</table>
);
}
Система
function System({ system: { id, SystemName } }) {
const [planets, setPlanets] = useState([]);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
const getPlanets = async () => {
const response = await fetch(
`https://localhost:44389/api/systemlist/GetSystems/${id}`,
);
const data = await response.json();
setPlanets(Object.values(data));
setIsLoading(false);
};
getPlanets();
}, [id]);
return (
<tr>
{isLoading && <td>Loading...</td>}
{!isLoading && (
<>
<td>{SystemName}</td>
<td>
<table>
<tr>
<td>Planets</td>
</tr>
{planets.map((planet) => (
<Planet planet={planet} />
))}
</table>
</td>
</>
)}
</tr>
);
}
Планета
const Planet = ({ planet: { PlanetName } }) => (
<tr>
<td>{PlanetName}</td>
</tr>
);
Что вы думаете об этом подходе?