UseInfiniteQuery, но все данные перерисовываются при каждом обновлении

Я пытаюсь разбить на страницы с помощью useInfiniteQuery в React Query, он отлично обновляет данные, но есть проблема, заключающаяся в том, что каждый раз, когда добавляются новые данные, страница перерисовывает весь список данных, включая существующие, и переходит к началу страницы, в то время как я хочу, чтобы он продолжал получать и отображать новые данные при прокрутке. Я делаю это как док, так что кто-нибудь может помочь?
Документы: https://react-query.tanstack.com/examples/load-more-infinite-scroll

  const { ref, inView } = useInView();

  const { status, data, isFetching, isFetchingNextPage, fetchNextPage } =
    useInfiniteQuery(["videos", endpoint], getVideo, {
      getNextPageParam: () => 5,
    });

  useEffect(() => {
    if (inView) {
      console.info("Loaded more");
      fetchNextPage();
    }
  }, [inView]);

  return (
    <div className = "recommended_videos">
      <h2>Recommended Videos</h2>

      {status === "loading" || isFetching ? (
        <Loader />
      ) : status === "error" ? (
        <div>Error</div>
      ) : (
        <div className = "recommended_videos_videos">
          {data?.pages.map((page) =>
            page.data?.items?.map?.((video) => (
              <VideoCard
                video = {video}
                id = {(video.id.videoId && video.id.videoId) || video.id}
                key = {(video.id.videoId && video.id.videoId) || video.id}
              />
            ))
          )}
        </div>
      )}
      <div ref = {ref}>
          {isFetchingNextPage ? <Loader /> : null}
      </div>
    </div>
  );
};

Их пример на самом деле делает то же самое, что и ваш. Единственная разница в том, что их API кажется исправленным, и никогда не поступают «новые данные».

Richard Hpa 13.05.2022 04:32

Почему вы передали «видео» и конечную точку как массив? Они не сделали, как это в примере.

Shikhar 13.05.2022 04:36

Да, я тестирую фиксированный API, но он все еще работает, поскольку новые данные все еще добавляются, несмотря на дублирование, так что, возможно, проблема не в данных.

NamNgo 13.05.2022 04:38

Вот как работает ответный запрос, мне нужно передать конечную точку функции getVideo, а «видео» — это просто ключ

NamNgo 13.05.2022 04:39

Попробуйте создать codeSandbox для вашей проблемы, так как это очень поможет.

Richard Hpa 13.05.2022 04:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
5
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обнаружил, что проблема здесь

status === "loading" || isFetching ? (<Loader />)

Потому что каждый раз при обновлении isFetching всегда обращаются к true, поэтому весь компонент должен быть перерендерен.
На самом деле я убрал все это условие, потому что под списком данных использовал другое
Кстати, большое спасибо за предложения.

Другие вопросы по теме