Почему не работает lazy load?

Рейтинг: 0Ответов: 0Опубликовано: 21.06.2023

У меня есть некий массив пользователей и я пробегаюсь по нему мапом.Всего 1000 пользователей, мне нужно сделать так чтоб на странице было 40 юзеров и только когда скролл подходит к концу - подгружались еще 40 и так до тех пор пока не закончатся пользователи.Но у меня мой код не срабатывает - на странице отображается всего 40 пользователей а остальные не подгружаются. В чем я ошибся ?

import React, { useState, useEffect } from 'react';
import { users, generateUsers } from '../../users/generateUsers.tsx';
import UserItem from '../userItem/UserItem.tsx';
import { nanoid } from 'nanoid';

export default function UserList() {
  const [loadedUsers, setLoadedUsers] = useState(users.slice(0, 40)); // Первоначально загружаем 40 пользователей
  const [allUsers, setAllUsers] = useState(users); //В users находится 1000 юзеров

  useEffect(() => {
    // Обработчик скролла страницы
    const handleScroll = () => {
      // Получаем высоту окна браузера
      const windowHeight = window.innerHeight;
      // Получаем текущую прокрутку страницы
      const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
      // Получаем высоту всего контента страницы
      const documentHeight = document.documentElement.offsetHeight;

      // Проверяем, достигли ли мы нижней части страницы
      if (windowHeight + scrollTop >= documentHeight) {
        // Вычисляем индексы для следующей порции загружаемых пользователей
        const nextBatchStartIndex = loadedUsers.length;
        const nextBatchEndIndex = nextBatchStartIndex + 40;

        // Проверяем, остались ли еще пользователи для загрузки
        if (nextBatchStartIndex < allUsers.length) {
          // Загружаем следующую порцию пользователей
          const nextBatch = allUsers.slice(nextBatchStartIndex, nextBatchEndIndex);
          setLoadedUsers(prevLoadedUsers => [...prevLoadedUsers, ...nextBatch]);
        }
      }
    };

    // Добавляем обработчик события скролла
    window.addEventListener('scroll', handleScroll);

    // Очищаем обработчик при размонтировании компонента
    return () => {
      window.removeEventListener('scroll', handleScroll);
    };
  }, [loadedUsers, allUsers]);

  return (
    <div>
      {loadedUsers.map((user) => (
        <UserItem
          key={nanoid()}
          color={user.color}
          speed={user.speed}
          name={user.name}
          time={user.time}
        />
      ))}
    </div>
  );
}

Ответы

Ответов пока нет.