Почему информация не отображается?

Почему информация не отображается, пока данные ещё не загружены с API? Мне нужно, чтобы информация выводилась даже в том случае, если не все данные были получены с API. Вот ссылка на приложение <a href="https://avia-green.vercel.app/" rel="nofollow">ссылка</a>.<br/><pre><code class="typescript">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 }) =&gt; {
  const [count, setCount] = useState();
    
  useEffect(() =&gt;{
   
    getTicketsTC()
  },getTicketsTC)
  
  
  const sortingValue = sort.filter((el) =&gt; el.checked)[0]?.value;

  const filterTicketsList = (list, filterValue) =&gt; {
    let filteredList = [];
    for (let item of filterValue) {
      if (item.value === 'direct' &amp;&amp; item.checked)
        filteredList.push(...list.filter((i) =&gt; i.segments[0].stops.length === 0));
      if (item.value === 'one-stop' &amp;&amp; item.checked)
        filteredList.push(...list.filter((i) =&gt; i.segments[0].stops.length === 1));
      if (item.value === 'two-stop' &amp;&amp; item.checked)
        filteredList.push(...list.filter((i) =&gt; i.segments[0].stops.length === 2));
      if (item.value === 'three-stop' &amp;&amp; item.checked)
        filteredList.push(...list.filter((i) =&gt; i.segments[0].stops.length === 3));
    }
    return filteredList;
  };

  const sortingTicketsList = (list, sortingValue) =&gt; {
    if (sortingValue === 'cheapest') return [...list].sort((a, b)
  • 8 февраля 2025 г. 15:34
Ответы на вопрос 1
Чтобы информация отображалась даже в том случае, если не все данные были загружены с 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` для определения, загружаете ли вы данные.
- **Отображение загруженных данных**: Как только данные будут загружены, отображайте их в компоненте.

Это позволит улучшить пользовательский опыт, так как пользователи смогут видеть часть информации даже в процессе загрузки.
Похожие вопросы