Чтобы информация отображалась даже в том случае, если не все данные были загружены с API, вам нужно внести изменения в логику отрисовки компонентов. Вместо того чтобы ждать, когда все данные будут загружены, можно отобразить уже полученные данные, а также рендерить индикатор загрузки или сообщения при отсутствии данных.
Вот несколько рекомендаций, как это можно сделать:
1. **Проверяйте состояние загрузки и данные**: Используйте `isLoading` для проверки состояния загрузки и отображения либо индикатора загрузки, либо уже полученных данных. Если данные еще не загружены, отображайте сообщение о загрузке. Если данные загружены, показывайте их.
2. **Отображение загруженных данных**: Если у вас есть часть данных, которая уже загружена, вы можете отобразить её, пока остальные еще загружаются. Это можно сделать, проверяя длину массива `tickets`.
Вот пример реализации:
```javascript
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import ShowMore from '../ShowMore/ShowMore';
import Spinner from '../../UI/Spinner/Spinner';
import { getTicketsTC } from '../../actions/apiActions';
import Ticket from './Ticket/Ticket';
import styles from './Tickets.module.css';
const Tickets = ({ tickets, sort, filter, error, isLoading, getTicketsTC }) => {
useEffect(() => {
getTicketsTC();
}, [getTicketsTC]);
const sortingValue = sort.filter((el) => el.checked)[0]?.value;
const filterTicketsList = (list, filterValue) => {
let filteredList = [];
for (let item of filterValue) {
if (item.value === 'direct' && item.checked)
filteredList.push(...list.filter((i) => i.segments[0].stops.length === 0));
if (item.value === 'one-stop' && item.checked)
filteredList.push(...list.filter((i) => i.segments[0].stops.length === 1));
if (item.value === 'two-stop' && item.checked)
filteredList.push(...list.filter((i) => i.segments[0].stops.length === 2));
if (item.value === 'three-stop' && item.checked)
filteredList.push(...list.filter((i) => i.segments[0].stops.length === 3));
}
return filteredList;
};
const sortingTicketsList = (list, sortingValue) => {
if (sortingValue === 'cheapest') return [...list].sort((a, b) => a.price - b.price);
// Add other sorting logic here if needed
return list;
};
const filteredTickets = filterTicketsList(tickets, filter);
const sortedTickets = sortingTicketsList(filteredTickets, sortingValue);
return (
<div className={styles.tickets}>
{isLoading && <Spinner />}
{error && <div>Error loading tickets: {error}</div>}
{!isLoading && sortedTickets.length === 0 && <div>No tickets found</div>}
{!isLoading && sortedTickets.length > 0 && sortedTickets.map(ticket => (
<Ticket key={ticket.id} ticket={ticket} />
))}
{/* If you want to show a "Show More" button or component, you can place it here */}
{sortedTickets.length > 0 && <ShowMore />}
</div>
);
};
const mapStateToProps = (state) => ({
tickets: state.tickets,
sort: state.sort,
filter: state.filter,
error: state.error,
isLoading: state.isLoading,
});
export default connect(mapStateToProps, { getTicketsTC })(Tickets);
```
### Важные моменты:
- **Добавление обработчиков ошибок**: Отображайте сообщения об ошибках, если `error` не null.
- **Стандартная проверка загрузки**: Используйте `isLoading` для определения, загружаете ли вы данные.
- **Отображение загруженных данных**: Как только данные будут загружены, отображайте их в компоненте.
Это позволит улучшить пользовательский опыт, так как пользователи смогут видеть часть информации даже в процессе загрузки.