Как дождаться загрузки изображений на странице перед отображением данных с сервера?

Как отрисовать компонент таким образом, чтобы при загрузке данных сразу появлялся весь контент, включая изображения?
  • 3 октября 2023 г. 19:37
Ответы на вопрос 1
Есть несколько способов дождаться загрузки изображений на странице перед отображением данных с сервера. 

1. Использование событий загрузки изображений: 
   - Добавьте обработчики событий `load` для каждого изображения на странице.
   - Создайте состояние (например, переменную `isLoaded`), которое будет отслеживать загрузку всех изображений.
   - При каждом событии загрузки изображения установите значение `isLoaded` в `true`.
   - При загрузке данных с сервера проверьте, все ли изображения загружены (проверка значения `isLoaded`).
   - Если все изображения загружены, отобразите данные с сервера. В противном случае, пока не все изображения загружены, можно показать какой-то прелоадер или заглушку.

2. Использование Promise:
   - Создайте промис для каждого изображения на странице, используя конструктор `Promise`.
   - Внутри каждого промиса добавьте обработчик события `load` для соответствующего изображения.
   - Используя `Promise.all`, вы можете создать промис, который будет выполнен, когда загрузятся все изображения.
   - При загрузке данных с сервера, дождитесь выполнения промиса, используя `await`. После этого отобразите данные с сервера.

Отрисовка компонента таким образом, чтобы при загрузке данных сразу появлялся весь контент, включая изображения, может быть реализована следующим образом:

1. При загрузке компонента, установите состояние загрузки на `true`. 
2. После загрузки данных с сервера и всех изображений, установите состояние загрузки на `false`.
3. В компоненте, используйте условный рендеринг, чтобы либо показать прелоадер или заглушку загрузки, когда состояние загрузки равно `true`, либо отобразить данные с сервера, когда состояние загрузки равно `false`.

Примерный код может выглядеть следующим образом:

```jsx
import React, { useState, useEffect } from 'react';

const MyComponent = () => {
  const [isLoading, setIsLoading] = useState(true);

  useEffect(() => {
    const fetchData = async () => {
      // Загрузка данных с сервера
      // ...

      // Проверка загрузки изображений
      const images = document.querySelectorAll('img');
      const imagePromises = Array.from(images).map(
        (img) =>
          new Promise((resolve) => {
            img.addEventListener('load', resolve);
          })
      );
      
      await Promise.all(imagePromises);

      // Установка состояния загрузки в false после загрузки всех изображений
      setIsLoading(false);
    };

    fetchData();
  }, []);

  return (
    <div>
      {isLoading ? (
        // Показать прелоадер или заглушку загрузки
        <div>Loading...</div>
      ) : (
        // Отобразить данные с сервера
        <div>Data from server</div>
      )}
    </div>
  );
};

export default MyComponent;
```

В этом примере, пока идет загрузка данных и изображений, на странице будет отображаться прелоадер или заглушка "Loading...". После загрузки данных и всех изображений, отоборажаются данные с сервера.
Похожие вопросы