React Native - Firebase数据库导致应用程序刷新值更改

时间:2018-03-21 01:38:33

标签: firebase react-native firebase-realtime-database

Firebase在数据库中修改数据时自动刷新我的应用是否正常?因为我没有实现任何刷新,所以如果我从数据库中更改了值,我会突然回到主窗口。

我读到setState可能会令人耳目一新。所以我故意添加以下几行:

componentDidMount = () => {
    this._ismounted = true;
}

componentWillUnmount = () => {
    this._ismounted = false;
  }

每次我想调用setState时,我都会检查if(this._ismounted),但仍然会以某种方式完全刷新我的应用。

我对Firebase缺乏经验,并且很乐意接受有关此事的任何解释或反馈。

这就是我使用firebase的方式:

componentDidMount() {
    this._ismounted = true;
    const userId = firebase.auth().currentUser.uid;
    firebase
      .database().ref("users/" + userId).on("value", snapshot => {
        if(this._ismounted) {
           this.setState({
           firstName: snapshot.child("firstName").val(),
           lastName: snapshot.child("lastName").val(),
           birthDay: snapshot.child("dateOfBirth").val()
        }
    });}                                                                   

1 个答案:

答案 0 :(得分:1)

在不查看代码的情况下回答此问题的最佳方法是让您了解firebase的基础知识。

Firebase有各种类型的监听器,有关它的详细说明可以在他们的官方文档中找到 here。如果你正在使用' on'具有“价值”的倾听者事件

database.child('/childNode').on('value', (snapshot) =>{this.setState(Object) })

以上代码将始终更改您所呼叫的状态中的数据'自动刷新'。这将继续改变您所在州的数据,直到您不分离听众

另一方面,如果你这样做

database.child('/childNode').once('value').then( (snapshot)=> { this.setState(Object)}).catch( err => console.log(err) )

这种类型的侦听器只会获取一次数据,即使您的firebase中的数据发生更改,也无法再次更新您所在州的数据。

根据您的要求,您应该选择合适的听众。在根节点上使用on值侦听器将获取数据库中的所有内容,即使在某个子节点中更改了一个小数据,而如果要继续保持数据更新,则使用一次侦听器将获取过时数据。

希望这会有所帮助。随意请求更多解释。

编辑:

参考上面的解释和你的代码(假设你只想获取一次数据而不是在数据库中更改它时再次更新它)你可以使用一次监听器。

firebase.database().ref("users/" + userId).once("value").then( (snapshot) => {
           this.setState({
           firstName: snapshot.child("firstName").val(),
           lastName: snapshot.child("lastName").val(),
           birthDay: snapshot.child("dateOfBirth").val(),
         });
  }