javascript - 在结果之上使用实时添加对 Firestore 数据进行分页
问题描述
我想在反应中将我的数据加载到 10 个块中。我正在使用 onSnapshot() firestore 方法监听文档添加。我想对数据进行分页,同时允许最近添加的内容出现在顶部。如何在下面的代码中应用它 -
db.collection('palettes').orderBy("createdAt").onSnapshot(snapshot => {
snapshot.docChanges().forEach(change => {
if (change.type === "added") {
setPalette( prevPalette => ([
{ id: change.doc.id, ...change.doc.data() },
...prevPalette
]))
setIsLoading(false)
}
})
})
解决方案
我认为您应该保存最后一个文档的状态以进行分页和实时更新
例子
const getPalettes = (pageSize, lastDocument) => new Promise((resolve, reject) => {
let query = db.collection('palettes')
.orderBy("createdAt")
if(lastDocument) {
query = query.startAt(lastDocument)
}
query = query.limit(pageSize);
return query.onSnapshot(query => {
const docs = query.docs.map(pr => ({pr.id, ...pr.data()}))
resolve(docs);
});
})
let unsubscribe = getPalettes(10).then(newPalettes => {
setPalette(palettes => [...palettes, newPalettes]);
lastPalette = newPalettes[newPalettes.length -1];
setLastPalette(lastPalette);
unsubscribe();
})
unsubscribe = getPalettes(10, lastPalette).then(newPalettes => {
setPalette(palettes => [...palettes, newPalettes]);
lastPalette = newPalettes[newPalettes.length -1];
setLastPalette(lastPalette);
unsubscribe();
})
const listenForLatestPalettes = (lastDocument, callback) => {
return db.collection('palettes')
.orderBy("createdAt")
.startAt(lastDocument)
.onSnapshot(callback);
}
const callback = snapshot => {
for(let change of snapshot.docChanges()) {
if (change.type === "added") {
setPalette(palettes => {
const palette = { id: change.doc.id, ...change.doc.data() };
return [...palettes.filter(pal => pal.id !== id], palette];
})
}
}
}
unsubscribe = listenForLatestPalettes(lastDocument, callback);
推荐阅读
- keycloak - Keycloak 10 在作为服务运行时部分启动
- javascript - 如何检查数组输入字段是否以jquery中的特定字符串开头
- excel - 从一个用户表单到另一个用户表单
- powershell - 将 Powershell 输出放入批处理脚本中的变量中
- kubernetes - Kubernetes 将 YAML 转换为 JSON 时出错:yaml:第 30 行:找不到预期的“:”
- flutter - 如何在flutter中将具有文档ID的自定义对象设置为firestore中的集合?
- python - 使用 Python 在图像上生成带有受控参数的文本
- php - 第二次从套接字写入和读取
- openmdao - 因子的含义正是在组中找到的单数/单数条目
- angular - 如何将日期字符串转换为时区特定日期。?