反应本机-Firebase数据库导致应用程序在值更改时刷新

反应本机-Firebase数据库导致应用程序在值更改时刷新,firebase,react-native,firebase-realtime-database,Firebase,React Native,Firebase Realtime Database,当数据库中的数据被修改时,Firebase自动刷新我的应用程序是正常行为吗?因为我没有实现任何刷新,如果更改数据库中的值,我会突然返回到主窗口 我读到setState可能会导致刷新。所以我特意添加了以下几行: componentDidMount = () => { this._ismounted = true; } componentWillUnmount = () => { this._ismounted = false; } 每次我想调用setState时

当数据库中的数据被修改时,Firebase自动刷新我的应用程序是正常行为吗?因为我没有实现任何刷新,如果更改数据库中的值,我会突然返回到主窗口

我读到setState可能会导致刷新。所以我特意添加了以下几行:

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

componentWillUnmount = () => {
    this._ismounted = false;
  }
每次我想调用setState时,我都会检查它是否已安装,但我的应用程序还是会完全刷新

我对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()
        }
    });}                                                                   

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

Firebase有各种类型的监听器,关于它的详细描述可以在他们的官方文档中找到 . 如果将“on”侦听器与“value”事件一起使用

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-value侦听器将获取数据库中的所有数据,即使某个子节点中的一个小数据发生了更改,而如果要持续更新数据,则使用once-listener将获取陈旧数据

希望这有帮助。请随意要求更多的解释

编辑:

参考上面的解释和您的代码,假设您只想获取数据一次,而不想在数据库中更改数据时再次更新数据,那么您可以使用once侦听器

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(),
         });
  }

现在,这取决于您编写的代码,您能否在应用程序中共享您如何从firebase读取数据的代码片段?您在哪里修改数据?你的组件是什么样子的?你能在使用firebase query的地方发布代码吗。如果您在事件中使用。每次firebase中的数据发生更改时,它都会刷新。我已将正在使用的代码添加到上述问题的描述中。实际上,我正在使用.on从firebase检索数据。这可能是我的整个面板重新启动的原因吗?我只希望检索一次信息,不希望刷新,直到用户手动按下刷新按钮。我如何才能做到这一点?事实上,问题在于使用.on。在把它改成之后。一旦一切都开始正常工作。感谢您为我提供有关firebase工作原理的见解。如果我手动刷新面板,我是否应该在面板上调用forceUpdate?我的意思是,这是一个好的做法,还是我应该用另一种方式来做?手动刷新数据是什么意思?你的意思是说,通过应用程序,例如,用户将执行一些手势和数据应该更新?如果是这样的话,同样的代码也可以用于手势。代码将在执行该手势时从firebase中提取所有数据,然后您可以简单地设置状态。是的,如果用户决定向下滑动以刷新当前面板中的信息。被调用的函数应该是什么?它是否应该再次调用上面的.once方法?是的。当用户刷下时,您可以再次调用相同的方法谢谢,先生!你真的帮了大忙。我希望你有一个愉快的一天。