Maison > Questions et réponses > le corps du texte
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粉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 ..!