当前位置: 首页 > 知识库问答 >
问题:

在ReactJS中手动刷新Firebase对象

萧明贤
2023-03-14

我有一个小的应用程序,用户可以输入一个人的名字,并将他们添加到一个板上,然后用户可以向上或向下投票他们(为梦幻足球)。目前,唯一不需要刷新页面而立即发生的事情是通过文本输入框添加播放器。这为对象做了一点淡入,它就会出现在屏幕上:

addPlayer(player) {

this.state.user ?
  this.database.push().set({ playerContent: player, votes: 0})
  :
  console.log("Not Logged In")
}

这是不是因为是推送才实时完成的?在用户投票后,我如何更新玩家的游戏板?现在,如果说无名氏有两票,无名氏有两票,你投无名氏最多3票,他不会跳到无名氏前面,直到你刷新页面。有没有一种方法可以在你投票的时候刷新每一个单独的对象?这是我的投票代码

upvotePlayer(playerId) {
if(this.state.user) {
  let ref = firebase.database().ref('/players/' + playerId + '/voters');

  ref.once('value', snap => {
    var value = snap.val()
    if (value !== null) {            
        ref.child(this.uid).once('value', snap => {
          if (snap.val() === 0 || snap.val() === -1 || snap.val() == null){
            ref.child(this.uid).set(1);
          } else if (snap.val() === 1) {
          ref.child(this.uid).set(0);
          }
          else {
            console.log("Error in upvoting. snap.val(): " + snap.val())
          }

        })

    } else {
        console.log("Doesn't exist")
        ref.child(this.uid).set(1);
    }
});
}
else {
    console.log("Must be logged in to vote.")
}
}

如果我缺少相关代码,请告诉我,我会提供。我尝试在投票后调用componentdidmountthis.forceupdate()(即使它是不鼓励的),只是想看看它是否是一个解决方案,但它似乎不是。

这是在app.js中呈现的player组件

{
  orderedPlayersUp.map((player) => {
    return (
      <Player
        playerContent={player.playerContent}
        playerId={player.id}
        key={player.id}
        upvotePlayer={this.upvotePlayer}
        downvotePlayer={this.downvotePlayer}
        userLogIn={this.userLogIn}
        userLogOut={this.userLogOut}
        uid={this.uid}
      />
    )
  })
}

当我将upvotePlayer函数的数据库调用更改为.on而不是.on时,一旦并继续向上投票一个玩家,它会向我的控制台喷出无限量的日志。来自此组件的日志将挂载函数:

app.js第51行是下面的console.log。

  this.database.on('child_changed', function (snapshot) {
    var name = snapshot.val();
    console.log("Player: " + name.playerContent + " has  " + name.votes + " votes.")
  })

当我将comondentDidMount()中的player.jsx文件中的.once.on更改为.on时,投票立即开始注册到屏幕上,如下所示。澄清一下,这解决了我的问题,即投票图标在我从上投改为下投时没有实时改变。我还没有测试它是否注册一个球员超过另一个更多的票数,正如我最初的要求。只是想为任何可能翻阅这段代码以帮助自己的人澄清一下。

componentDidMount() {
  let ref = firebase.database().ref('/players/' + this.playerId + '/voters');

  ref.on('value', snap => {
    var value = snap.val()

    if (value !== null && this.props.uid !== null) {       
        ref.child(this.props.uid).on('value', snap => {
          if (snap.val() === 1){
            this.setState({ votedUp: true, votedDown: false })
            }
          else if (snap.val() === 0) {
            this.setState({ votedUp: false, votedDown: false })
          }
          else if (snap.val() === -1) {
            this.setState({ votedDown: true, votedUp: false })
          }
          else {
          console.log("Error calculating the vote.")
          }
        })
    } else {
      //Error
    }
});

  }

共有1个答案

阎彬炳
2023-03-14

您的firebase调用目前是一个.once()调用。只会调用数据库一次。如果希望组件继续监听更改,那么需要切换到.on()调用。因此,这将是ref.child(this.uid).on(...)而不是ref.child(this.uid).once(...)

ref.child(this.uid).on('value', snap => {
          if (snap.val() === 0 || snap.val() === -1 || snap.val() == null){
            ref.child(this.uid).set(1);
          } else if (snap.val() === 1) {
          ref.child(this.uid).set(0);
          }
          else {
            console.log("Error in upvoting. snap.val(): " + snap.val())
          }

        })
 类似资料:
  • 问题内容: 我正在使用Firebase电子邮件/密码身份验证。用户成功登录后,我将通过以下方式查询访问令牌: 根据Firebase文档,访问令牌会在1小时后过期。为了处理在我的应用程序中始终具有当前访问令牌的情况,我在寻找解决方案,并且在firebase文档中发现我必须注册Firebase.IdTokenListener来侦听 onIdTokenChanged事件 我的问题是 : onIdToke

  • onIdTokenChanged事件 我的问题是: onIdTokenChanged事件 IDTokenListener 被触发。但这不是我要找的。

  • 问题内容: 我将添加拉动以刷新我的Web视图,以便刷新我的Web视图。我已经看到了此页面上的所有问题,但我找不到添加拉动刷新的好方法… Mainactivity.java content_main.xml 我希望任何人都能帮助我并为我解决这个问题。 问题答案: 您可以像这样在Swipe Refesh布局中包装webview 在java中

  • 使用Firebase.auth(),如果身份验证状态没有改变,如何刷新/重新获取用户? 我有一个使用电话号码进行身份验证的用户。我向点击该链接的用户发送电子邮件验证链接。该链接验证用户电子邮件(更新记录),并显示一个“继续”按钮,该按钮(通过deeplink)返回到应用程序。回到应用后,我想从 Firebase 重新提取用户记录,以便查看用户电子邮件是否已通过验证。我该怎么做?

  • 问题内容: 我有一个问题,在写入文件时,在关闭之前,我们应该包括flush()??吗?如果是这样,它将怎样做?不要流自动冲洗?编辑: 那么冲洗它实际上是做什么的? 问题答案: 编写器和流通常在内存中缓冲一些输出数据,并尝试一次将其写入更大的块中。刷新将导致立即从缓冲区写入磁盘,因此,如果程序崩溃,数据也不会丢失。当然不能保证,因为磁盘可能不会立即物理写入数据,因此仍然可能会丢失。但这不是Java程

  • 问题内容: 如何在 ReactJS中 手动触发click事件?当用户单击element1时,我想自动触发对标签的单击。 问题答案: 您可以使用该道具通过回调获取对基础HTMLInputElement对象的引用,将该引用存储为类属性,然后使用该引用稍后使用HTMLElement.click方法触发事件处理程序中的单击。 在您的方法中: 在事件处理程序中: 完整示例: 请注意 ES6箭头函数,该函数为