reactjs - Firebase 实时数据库分页未按预期工作
问题描述
我有一个 React 页面,我从我的 firebase 实时数据库中加载帖子。数据库结构如下:
posts
-abcdefh
body: 1st post
createdAt: 1
-ijklmnop
body: 2nd post
createdAt: 2
.
.
.
我第一次使用下面的 useEffect 挂钩来获取前两个帖子。
useEffect(()=>{
let isMounted = true;
if (isMounted){
window.addEventListener('scroll', loadMore);
let posts = [];
fbRef.db.ref().child('/posts').orderByChild('createdAt').limitToFirst(2).on('value', (snapshot)=>{
snapshot.forEach((childSnapshot)=>{
posts.push({...childSnapshot.val(), key: childSnapshot.key});
});
setPosts(posts);
console.log('post set');
});
}
return ()=>{isMounted = false; window.removeEventListener('scroll', loadMore);}
}, []);
当滚动到页面底部时,loadMore() 函数会触发 getPosts() 函数以获取接下来的 2 个帖子,如下所示:
const loadMore = ()=>{
if (window.innerHeight + document.documentElement.scrollTop === document.scrollingElement.scrollHeight){
getPosts();
}
}
//Get the next two posts in the list
const getPosts = ()=>{
let posts = [];
fbRef.db.ref().child('/posts').orderByChild('createdAt').limitToFirst(2).startAfter(last).on('value', (snapshot)=>{
snapshot.forEach((childSnapshot)=>{
posts.push({...childSnapshot.val(), key: childSnapshot.key});
});
setPosts(posts);
});
}
状态变量“last”用于跟踪从数据库中获取的最后一篇文章。这是在另一个 useEffect 挂钩中设置的:
useEffect(()=>{
if (posts.length>0){
setLast(posts.at(-1).key);
}
}, [posts]);
问题:当页面加载时,第一个和第二个帖子按预期显示,但在滚动到底部时,即使 startAfter() 函数预计会返回列表中的下两个帖子,也会再次加载相同的两个帖子。当 getPosts() 函数被触发时,如何加载列表中的下两个帖子?任何帮助将不胜感激!
解决方案
推荐阅读
- python - 附加到一个 numpy 数组
- angularjs - AngularJS 将 uib 模态结合到一个服务中
- objective-c - 我在子类中重写了一个属性的setter,但是当我在超类的init方法中调用它时,为什么子类的方法响应?
- javascript - js jest mock 类和静态方法
- android - Branch.io 应用安装响应
- ruby-on-rails - 如何在 travis 中自动升级宝石?
- python - Python if 分支“期望一个缩进块”
- html - 将编辑和删除图标放置在图像下方
- php - 使用 xdebug 调试 ionCube 编码的 php 文件时出现 ERR_EMPTY_RESPONSE
- git - 防止 Jenkins 在构建运行时轮询 SCM (Git)