【发布时间】:2019-11-27 21:24:21
【问题描述】:
我有一个简单的集合,我想分页。
我想通过一个名为createdAt 的时间戳文档对其进行排序和分页。
这是当前调用的样子:
function getPaginatedItems (db, startAfter) {
return db
.collection('items')
.orderBy('createdAt')
.startAfter(startAfter) // startAfter parameter will be a createdAt Timestamp doc
.limit(3)
.get()
}
为了使它更易于使用和显示,我创建了一个函数,将这个查询快照转换为一个分页对象。这看起来像这样:
function querySnapshotToPaginatedObject (querySnapshot, total, limit = 3) { if (querySnapshot.empty) {
return {
total: 0,
limit,
data: []
}
} else {
return {
total,
limit,
data: querySnapshot.docs.map(doc => ({
id: doc.id,
...doc.data()
}))
}
}
}
就目前而言,我的 Firestore 中总共有 11 件物品,但我想将它们分成三块。这一切都在处理数据时完美运行,但是我的问题变成了,我该如何回去?也就是如何从之前的页面中获取数据?
目前我手中的东西是我拥有的物品总数,可以显示的限制以及我目前正在展示的三个物品。
我不知道如何跟踪所有其他页面以便跳回页面,或者跳多页。
所以我想这里有两个问题:我如何回到以前的数据?以及如何跳转不同的数据块?
是否有另一种方法可以做到这一点,也许是通过索引而不是特定的文档(就像我对 createdAt 所做的那样)?
编辑:有人问我如何进行下一个查询。基本上我有按钮(都带有页码),当我点击它们时,我会从最后一项的createdAt 属性开始第二次调用。然后我对我的初始查询进行第二次调用,但将最后一个对象作为startAfter 参数传递给getPaginatedItems 函数调用。
我使用 react 作为前端,所以看起来像这样:
getNextBatch (startAfter) {
return {
paginatedItems: querySnapshotToPaginatedObject(
await getPaginatedItems(db, startAfter), 11, 3
)
}
}
...
export default class MyComponent extends React.Component (
render () {
return (
<div>
{this.props.paginatedItem.map(x => <div>{x.name} {x.createdAt}</div>)}
<button onClick={(evt) => console.warn('How do I go back???')}>
Back
</button>
<button onClick={(evt) => getNextBatch(paginatedItem[paginatedItem - 1].createdAt)}>
Next
</button>
</div>
)
}
)
请记住,每次单击按钮时组件都会重新渲染。
【问题讨论】:
-
你到底是如何向前翻页的?您显示的是第一个查询,而不是您如何进行后续查询。
-
@DougStevenson 我进行了编辑,显示了代码并给出了简要说明。
-
简要看...我认为 limit 可以采用多个参数(查看文档)。通常你可以传递一个
start、stop集合或limit、start集合。您的第一个起点可能是 0,3,第二个可能是 3,6(这可能因实施而异)。通过你要去的分页页面并计算你开始停止 -
endBefore 对您有用吗?它在文档中有所描述。
标签: javascript firebase google-cloud-firestore