首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用react-redux-firebase库的分页firestore

使用react-redux-firebase库的分页firestore
EN

Stack Overflow用户
提问于 2018-08-31 04:57:38
回答 1查看 1.2K关注 0票数 2

我想使用库react-redux-firebase:https://react-redux-firebase.com/构建一个分页特性

此外,我还想构建一个动态的orderby下拉列表。因此,当我更改orderby选项时,startAt参数接受当前的orderby字段并对其进行比较(因为startAt与以前的orderby相关)。我的问题是,当在当前页面中保留所有具有相同值的寄存器时,是因为startAt获取了一个它无法在数据库中跟踪的值。

有没有人能推荐一种最佳的方法,使用react-redux-firebase库来构建带有动态orderby选项的分页?

EN

回答 1

Stack Overflow用户

发布于 2020-10-11 05:52:18

试试这样的东西

代码语言:javascript
复制
import { useState, useEffect } from "react";
import { useFirestore, useFirestoreConnect } from "react-redux-firebase";
import { useSelector } from "react-redux";
import { APPOINTMENTS_COLLECTION } from "constants/firebasePaths";
import { RootState } from "store/rootReducer";
import { Appointment } from "model";
import { first, last  } from 'lodash';

export function useAppointmentsList() {
  const [pointer, setPointer] = useState<string | undefined>(undefined) // Current pointer
  const [forwardPointer, setForwardPointer] = useState<string | undefined>(undefined) // Forward pointer
  const [backwardPointers, setBackwardPointers] = useState<string[]>([]) // Backward pointers chain
  const [page, setPage] = useState(0) // current  page
  const [limit, setLimit] = useState(5) // limit

  const firestore = useFirestore();
  // Get auth from redux state
  const auth = useSelector(({ firebase: { auth } }: RootState) => auth);

  useFirestoreConnect([
    {
      collection: APPOINTMENTS_COLLECTION,
      where: ["createdBy", "==", auth.uid],
      orderBy: ["createdAt", "desc"],
      limit: limit + 1,
      startAt: pointer
    },
  ]);
  
  // Get appointments from redux state
  var appointments = useSelector(
    ({ firestore: { ordered } }: RootState) => ordered.appointments
  ) as Appointment[];

  // Set forward pointer
  useEffect(() => {
    if (appointments && appointments.length > limit) { 
      setForwardPointer(last(appointments)?.createdAt)
      appointments.splice(-1,1)
    }
  }, [appointments])

  // add pointer to back chain 
  useEffect(() => {
    if (appointments) {
      const firstItem = first(appointments)
      if (firstItem) { 
        setBackwardPointers((prevState) => { 
          const newState = prevState
          newState[page] = firstItem.createdAt
          return newState
        })
      }
    }
  }, [page, appointments])
  
  const handlePageChange = (event: any, newPage: number) => {
    if (appointments) {
      if (page < newPage && forwardPointer) {
        // Forward
        setPointer(forwardPointer)
      } else if (page > newPage) {
        // Backward
        setPointer(backwardPointers[newPage])
      }
    }
    if (appointments && appointments.length === limit) {
      setPage(newPage);
    } else { 
      console.log("No more record")
    }
  };

  return { appointments, limit, setLimit, page, handlePageChange};
}

然后在组件中使用:

代码语言:javascript
复制
import React from "react";
import { useAppointmentsList } from "./useAppointmentsList";
import { Appointment } from "model";

type AppointmentsListProps = {
  className: string;
};

const AppointmentsList: React.FC<AppointmentsListProps> = () => {
  const {
    appointments,
    limit,
    setLimit,
    page,
    handlePageChange
  } = useAppointmentsList();
  
const handleLimitChange = (event: any) => {
    setLimit(event.target.value);
  };
  return (
    <div>
     ...
              <TablePagination
                component="div"
                count={-1}
                onChangePage={handlePageChange}
                onChangeRowsPerPage={handleLimitChange}
                page={page}
                rowsPerPage={limit}
                rowsPerPageOptions={[5, 10, 25]}
              />
            </Card>
    </div>
  );
};
export default AppointmentsList;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52105252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档