【问题标题】:How to paginate Firestore data in react?如何在反应中对 Firestore 数据进行分页?
【发布时间】:2021-03-09 07:54:49
【问题描述】:

所以我一直在开发类似于 Instagram 的网络应用程序,我正在尝试对来自 firestore 的数据(帖子)进行分页,我尝试了下面的代码,但在调用函数 loadMorePosts 时它只显示接下来的两个 @987654323 @不保留以前的新帖子

问题一:为什么在loadMorePosts函数中设置帖子的时候不保留之前的新帖子? 我尝试应用扩展运算符,但没有帮助

setPosts(...posts,
          snapShot.docs.map((doc) => ({ id: doc.id, post: doc.data() }))
        );

问题2:为什么snapShot.docs[snapShot.docs.length - 1]是一个对象,不应该是一个数字吗?

问题 3:如何知道没有更多帖子可以获取?

代码:

 const [posts, setPosts] = useState([]);
 const [latestDoc, setLatestDoc] = useState(null);

  const test = [];
  useEffect(() => {
    const unsub = db
      .collection("posts")
      .orderBy("timestamp", "desc")
      .limit(2)
      .onSnapshot((snapShot) => {
        setPosts(
          snapShot.docs.map((doc) => ({ id: doc.id, post: doc.data() }))
        );

    setLatestDoc(snapShot.docs[snapShot.docs.length - 1]);
      });

    return unsub;
  }, []);

  const loadMorePosts = async () => {
    db.collection("posts")
      .orderBy("timestamp", "desc")
      .startAfter(latestDoc)
      .limit(2)
      .onSnapshot((snapShot) => {
        setPosts(
          snapShot.docs.map((doc) => ({ id: doc.id, post: doc.data() }))
        );
        setLatestDoc(snapShot.docs[snapShot.docs.length - 1]);
      });
    console.log(test);
    console.log(latestDoc);
  };

【问题讨论】:

标签: javascript reactjs firebase google-cloud-firestore


【解决方案1】:

问题一:为什么在函数loadMorePosts中设置帖子时不保留之前的新帖子? 因为 post 是一个数组,所以必须这样做:

setPosts([...posts,
      ...snapShot.docs.map((doc) => ({ id: doc.id, post: doc.data() }))
    ]);

问题 2:为什么 snapShot.docs[snapShot.docs.length - 1] 是一个对象,不应该是一个数字吗?
明明是对象,怎么可能是数字?
喜欢:

snapShot.docs = [ {object 1}, {object 2}, {object 3} ]
snapShot.docs[snapShot.docs.length - 1] = snapShot.docs[2] = {object 3}

问题 3:如何知道没有更多帖子可以获取?

你可以这样做:

const [ hasMore, setHasMore ] = useState(false);
setHasMore(snapShot.docs.length > 0);

【讨论】:

  • 嘿,我试过你的解决方案但是有一个问题,数组设置为posts[{prevData},{prevData},[{newData},{Data}]],因为我们使用映射它返回一个对象数组中的一个对象数组,所以你知道吗如何解决这个问题
  • posts = [{prevData},{prevData},[{newData},{Data}]]
  • 您可以使用 map 函数中的 spread 将对象数组传播到对象。 setPosts([...posts, ...snapShot.docs.map((doc) => ({ id: doc.id, post: doc.data() })) ]);
  • 嘿,您的解决方案有效,但是当我们添加新的 posts 时,它只会显示您看到的任何数量的帖子中的前 2 个帖子
  • 你能帮忙吗!!
猜你喜欢
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2018-11-17
相关资源
最近更新 更多