Есть несколько способов дождаться загрузки изображений на странице перед отображением данных с сервера.
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...". После загрузки данных и всех изображений, отоборажаются данные с сервера.