繁体   English   中英

如何对 Firestore v9 进行分页

[英]How to Paginate Firestore v9

我正在尝试对我的 Firestore 数据进行分页,但我很难让它正常工作。 我尝试使用startAfter function,但它不会加载下一组数据。 任何帮助,将不胜感激。

import { useParams,Link , useLocation} from "react-router-dom";
import { getFirestore, onSnapshot, collection, orderBy, limit, query, startAfter, limitToLast, startAt } from "firebase/firestore"
import { useEffect, useState } from "react";
import './App.css';
import {app} from './Firebase';
import Output from 'editorjs-react-renderer';
import { getAuth } from 'firebase/auth';
import { useAuthState } from 'react-firebase-hooks/auth';
const auth = getAuth();
const db = getFirestore(app);

export default function Drive() {
    const [user, loading, error] = useAuthState(auth);
    const [journals, setJournals] = useState([]);
    const [lastvisibility, setlastvisibility] = useState('');
    const location = useLocation();
    let params = useParams();
    useEffect(() => {
        const q = query(collection(db, `${params.filetype}`, `${user.uid}`, "journals"), orderBy('lastModified', 'desc'), limitToLast(5), limit(5));
        const load = onSnapshot(q, (snapshot) => {
            console.log(snapshot.docs);
            setJournals(snapshot.docs.map(doc => ({...doc.data(), id: doc.id})));
            setlastvisibility(snapshot.docs.length-1);
        })
    }, [location]);
    const scroll = () => {
        const q = query(collection(db, `${params.filetype}`, `${user.uid}`, "journals"), orderBy('lastModified', 'desc'), startAfter(lastvisibility), limit(5));
        const load = onSnapshot(q, (snapshot) => {
            //setJournals(snapshot.docs.map(doc => ({...doc.data(), id: doc.id})));
            setlastvisibility(lastvisibility + snapshot.docs.length-1);
            journals.push(snapshot.docs.map(doc => ({...doc.data(), id: doc.id})))
            console.log(lastvisibility);
            console.log(journals);
        })
    }
    var title = params.filetype.charAt(0).toUpperCase() + params.filetype.slice(1);
    return (
      <main style={{marginTop: "30px"}}>
        <h2>{title} Journals</h2>
        {journals.map((journal) => (
                    <Link to={`/edit/${params.filetype}/${journal.id}`} className='actioncard' key={journal.id} style={{ textDecoration: 'none' }}>
                        <h2 className="jounrals">{journal.name}</h2>
                        <p className='author'>{journal.author}</p>
                        <p style={{marginLeft: "10px"}}>{journal.lastModified.toDate().toDateString()}</p>
                        <div className='preview'><Output data={ journal.entry } /></div>
                     </Link>                    
                    ))}  
                     <div onClick={scroll} className='actioncard'>
                        <h2>Show More</h2>
                        <p className='author'>Click to load more files.</p>
                     </div>                    
      </main>
    );
  }
import { useParams,Link , useLocation} from "react-router-dom";
import { getFirestore, onSnapshot, collection, orderBy, limit, query, startAfter, limitToLast, startAt } from "firebase/firestore"
import { useEffect, useState } from "react";
import './App.css';
import {app} from './Firebase';
import Output from 'editorjs-react-renderer';
import { getAuth } from 'firebase/auth';
import { useAuthState } from 'react-firebase-hooks/auth';
const auth = getAuth();
const db = getFirestore(app);

export default function Drive() {
    const [user, loading, error] = useAuthState(auth);
    const [journals, setJournals] = useState([]);
    const [lastvisibility, setlastvisibility] = useState({});
    const location = useLocation();
    let params = useParams();
    useEffect(() => {
        const q = query(collection(db, `${params.filetype}`, `${user.uid}`, "journals"), orderBy('lastModified', 'desc'), limitToLast(5), limit(5));
        const load = onSnapshot(q, (snapshot) => {
            console.log(snapshot.docs);
            setJournals(snapshot.docs.map(doc => ({...doc.data(), id: doc.id})));
            setlastvisibility(snapshot.docs[snapshot.docs.length-1]);
        })
    }, [location]);
    const scroll = () => {
        const q = query(collection(db, `${params.filetype}`, `${user.uid}`, "journals"), orderBy('lastModified', 'desc'), startAfter(lastvisibility), limit(5));
        const load = onSnapshot(q, (snapshot) => {
            //setJournals(snapshot.docs.map(doc => ({...doc.data(), id: doc.id})));
            setlastvisibility(snapshot.docs[snapshot.docs.length-1]);
            setJournals(snapshot.docs.map(doc => ({...doc.data(), id: doc.id})));
            console.log(lastvisibility);
            console.log(journals);
        })
    }
    var title = params.filetype.charAt(0).toUpperCase() + params.filetype.slice(1);
    return (
      <main style={{marginTop: "30px"}}>
        <h2>{title} Journals</h2>
        {journals.map((journal) => (
                    <Link to={`/edit/${params.filetype}/${journal.id}`} className='actioncard' key={journal.id} style={{ textDecoration: 'none' }}>
                        <h2 className="jounrals">{journal.name}</h2>
                        <p className='author'>{journal.author}</p>
                        <p style={{marginLeft: "10px"}}>{journal.lastModified.toDate().toDateString()}</p>
                        <div className='preview'><Output data={ journal.entry } /></div>
                     </Link>                    
                    ))}  
                     <div onClick={scroll} className='actioncard'>
                        <h2>Show More</h2>
                        <p className='author'>Click to load more files.</p>
                     </div>                    
      </main>
    );
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM