recherche

Maison  >  Questions et réponses  >  le corps du texte

Problème React Infinite Scroll - plus de données récupérées

Bonjour, je développe une page qui extrait une liste d'éléments du magasin de données sanity.io et essaie d'afficher 10 éléments à la fois en utilisant un défilement infini afin que chaque fois qu'un élément tombe, 10 éléments supplémentaires soient rendus. Cependant, le problème que je rencontre est que seuls les 10 premiers éléments sont affichés et que la fonction fetchNextPages ne semble pas être appelée. Je me creuse la tête sur ce problème depuis des heures, toute aide serait appréciée

import React, { useState, useEffect } from "react";
import { useParams } from "react-router-dom";
import { client } from "../client";
import MasonryLayout from "./MasonryLayout";
import Spinner from "./Spinner";
import { feedQuery, searchQuery } from "../utils/data";
import InfiniteScroll from "react-infinite-scroll-component";

const Feed = () => {
  const [loading, setLoading] = useState(false);
  const { categoryId } = useParams();
  const [items, setItems] = useState(null);
  const [pages, setPages] = useState([]);
  const [firstId, setFirstId] = useState(10);
  const [lastId, setLastId] = useState(20);
  const [hasMore, setHasMore] = useState(true);

useEffect(() => {
    setLoading(true);

    if (categoryId) {
      const query = searchQuery(categoryId);
      client.fetch(query).then((data) => {
        setItems(data);
        setLoading(false);
      });
    } else {
      client.fetch(feedQuery).then((data) => {
        setItems(data);
        setLoading(false);
      });
    }
  }, [categoryId]);

  useEffect(() => {
    setPages(items?.slice(0, 10));
  }, [items]);


  const fetchNextPage = () => {
    const result = items.slice(firstId, lastId);
    setPages([...pages, ...result]);
    if (result.length===0 || result.length < 10) {
      setHasMore(false);
    }
    setFirstId(firstId + 10);
    setLastId(lastId + 10);
  };

  if (loading) return <Spinner message="Searching for items...!" />;
  if (!pages?.length) return <h2>No results available.</h2>;

  return (
    <InfiniteScroll
      dataLength={pages?.length}
      next={fetchNextPage}
      hasMore={hasMore}
      loader={
        <Spinner
          message="Searching for items..."
          endMessage={
            <p className="align-center font-extrabold">End of list.</p>
          }
        />
      }
    >
      <div>
        <div className="mt-4 bm-4 w-full rounded overflow-hidden shadow-lg bg-slate-50 pl-2 pr-2 pt-4 pb-4">
          <p>Some information about this … </p>
        </div>
        {pages && <MasonryLayout items={pages} />}
      </div>
    </InfiniteScroll>
  );
};
export default Feed;

 ​​

P粉939473759P粉939473759277 Il y a quelques jours407

répondre à tous(1)je répondrai

  • P粉745412116

    P粉7454121162024-02-27 09:06:37

    Hé, s'il te plaît, change ton code-

    const fetchNextPage = () => {
        const result = items.slice(firstId, lastId);
        setPages([...pages, ...result]);
        if (result.length===0 || result.length < 10) {
          setHasMore(false);
        }
        setFirstId(firstId + 10);
        setLastId(lastId + 10);
      };

    C'est... parce que je pense qu'il y a quelque chose qui ne va pas avec votre fetchNextPage -

    const fetchNextPage = () => {
      const result = items.slice(firstId, lastId + 10);
      setPages([...pages, ...result]);
      if (result.length === 0 || result.length < 10) {
        setHasMore(false);
      }
      setFirstId(lastId + 1);
      setLastId(lastId + 10);
    };

    Veuillez me dire si cela fonctionne. Je vais vous aider davantage ..!

    répondre
    0
  • Annulerrépondre