reactjs - React - Cloud FireStore - 如何向该组件添加分页?
问题描述
我正在尝试为这个 React 组件添加一个简单的分页。
首先,我运行一个查询来找出集合中的文档总数。接下来,在 useEffect 中,我运行第二个查询来显示数据。理想情况下,它应该在每页上显示 10 个文档。
import React, { useState, useEffect } from 'react';
import { db } from '../firebase';
import UpdateCard from './UpdateCard';
const List = () => {
const [cards, setCards] = useState([]);
const [beginAfter, setBeginAfter] = useState(0);
const [totalDoclNumbers, setTotalDoclNumbers] = useState(0);
const docLimit = 10;
const firstFetch = async () => {
const data = await db
.collection('FlashCards')
.get();
setTotalDoclNumbers(data.docs.length);
console.log('totalDoclNumbers is: ' + totalDoclNumbers);
};
firstFetch();
useEffect(() => {
const fetchData = async () => {
const data = await db
.collection('FlashCards')
.orderBy('customId', 'asc')
.limit(docLimit)
.startAfter(beginAfter)
.get();
setCards(data.docs.map((doc) => ({ ...doc.data(), id: doc.id })));
};
fetchData();
}, [beginAfter]);
// Creating a menu for our documents (100 documents per each menu)
const RenderDocumentMenu = () =>
Array(totalDoclNumbers / docLimit)
.fill()
.map((_, i) => {
const onClick = () => setBeginAfter(docLimit * i);
return (
<div key={i} className='document__set' onClick={onClick}>
{docLimit * i + 1} to {docLimit * i + docLimit} Data
</div>
);
});
return (
<>
<div className='document'>
<RenderDocumentMenu />
</div>
<ul className='list'>
{cards.map((card) => (
<li key={card.id} className='list__item'>
<UpdateCard card={card} />
<DeleteCard card={card} />
</li>
))}
</ul>
<AddCard />
</>
);
};
export default List;
但是当我运行代码时,我得到了这个错误:RangeError: Invalid array length On the following line: const RenderDocumentMenu = () =>
解决方案
OMG!,我发现了问题并可以解决它。原来,集合中的文档数量为58。
totalDoclNumbers是 58
文档限制为 10
因此结果: Array(totalDoclNumbers / docLimit) 是5.8
并且 JS 不知道如何处理 5.8。因为它应该是它必须为分页生成的链接数。
解决方案是将数字四舍五入(在本例中为 6):
Array(Math.ceil(totalDoclNumbers / docLimit))
我可以使用 Math.round,但是如果我们只有 54 个文档在我们的集合中,这将被四舍五入到只有 5 个链接,我们的解决方案将忽略最后 4 个文档。
因此,为了涵盖这些情况,我使用Math.ceil将我们的数字向上舍入到最接近的整数。
现在分页正在工作,但我不确定这是否是完成它的最佳方式。
将不胜感激任何建议或改进的解决方案。
推荐阅读
- git - Git稀疏结帐:无法识别将目录添加到现有列表
- angular - 排除角度模块
- python - Django:在通用视图中选择模型的下拉菜单
- angular - 谷歌地图 API 密钥错误 - Angular - ApiProjectMapError
- css - 远程桌面无法正确加载 css
- android - 带有 SupervisorJob 的协程 - 取消行为
- odoo - 如何在智能按钮的域操作中获得计算字段的值
- php - phpdesktop-chrome-57-php-7.13-rc 中的 Laravel 响应中的响应标头状态代码无效
- google-cloud-platform - 使用自定义公共 log4j 记录器的 Stackdriver 日志记录实现
- c++ - Visual Studio 的“添加引用”实际上是做什么的?