【问题标题】:Sort Data on react-firebase-hooks/database在 react-firebase-hooks/database 上对数据进行排序
【发布时间】:2021-06-25 21:38:39
【问题描述】:

所以在 React 中,我正在使用 "react-firebase-hooks/database" 包读取 firebase 实时数据库。

import { useList } from "react-firebase-hooks/database";
import { db, auth } from "../../firebase";

function GameHistory() {
  var dbRef = db.ref("/" + user.uid);

  const [snapshots, loading, error] = useList(dbRef);

所以基本上快照变量包含所有firebase实时数据库数据。 然后稍后在我的代码中,我只是将快照数组的每个元素映射到一个组件中。

问题来了,我想按照数据中.timestamp firebase 属性的顺序对快照数据进行排序。我不知道该怎么做。

我在映射时尝试对快照数据进行排序:

snapshots
            .sort((a, b) => {
              return a.val().timestamp > b.val().timestamp;
            })
            .map((game, index) => (MORE CODE

但这不起作用,因为 timestamp 是一个 firebase 对象,而 JavaScript 不知道如何处理它。

只是为了在时间戳变量上建立更多上下文,我将其定义为:

timestamp: firebase.firestore.FieldValue.serverTimestamp()

那么有什么方法可以对我的快照数据进行排序吗?或者我应该使用另一个包?如果我应该使用其他东西,请显示您如何读取和排序实时数据库的代码。

【问题讨论】:

    标签: reactjs firebase firebase-realtime-database react-hooks


    【解决方案1】:

    您在这里混合了两个不同的数据库:

    • import { useList } from "react-firebase-hooks/database" 和其他代码用于实时数据库。
    • timestamp: firebase.firestore.FieldValue.serverTimestamp() 用于 Cloud Firestore

    虽然这两个数据库都是 Firebase 的一部分,但它们是完全独立的,并且每个都有自己的 API。

    要将服务器端时间戳写入实时数据库,请使用:

    timestamp: firebase.database.ServerValue.TIMESTAMP
    

    我实际上也让数据库服务器处理排序,而不是在您的代码中这样做,这是通过:

    var dbRef = db.ref("/" + user.uid);
    const dbQuery = dbRef.orderByChild("timestamp");
    
    const [snapshots, loading, error] = useList(dbQuery);
    ...
    

    【讨论】:

    • 谢谢!我更新了时间戳的东西。另外,当我运行代码时,它说this.Ref.orderBy is not a function,我做了一些谷歌搜索,但.orderByChild 做同样的事情吗?另外,如果我想按降序对其进行排序,我该怎么做?我试过.orderBy("timestamp", "desc"),但没用。您是否建议我在 JS 中本地反转数组?
    • 糟糕,orderBy 打错了,应该是 orderByChild。 Firebase 中没有降序排序,请参阅 stackoverflow.com/…
    猜你喜欢
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2020-12-13
    • 1970-01-01
    相关资源
    最近更新 更多