Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果两个组件侦听相同的数据库引用,我可以选择运行哪个侦听器吗?_Javascript_Reactjs_Firebase Realtime Database - Fatal编程技术网

Javascript 如果两个组件侦听相同的数据库引用,我可以选择运行哪个侦听器吗?

Javascript 如果两个组件侦听相同的数据库引用,我可以选择运行哪个侦听器吗?,javascript,reactjs,firebase-realtime-database,Javascript,Reactjs,Firebase Realtime Database,我有两个组件A和B。渲染A时,它会侦听并添加firebase实时数据库中messagesRef的child_事件 state = { messagesRef: firebase.database().ref("privateMessages") }; addListeners = currentUserUid => { this.state.messagesRef.on("child_added", snap => { ... } } 但是

我有两个组件A和B。渲染A时,它会侦听并添加firebase实时数据库中messagesRef的child_事件

  state = {
    messagesRef: firebase.database().ref("privateMessages")
  };

addListeners = currentUserUid => {
    this.state.messagesRef.on("child_added", snap => {
    ...
    }
}
但是,组件B将从A呈现,并且它对同一引用也具有相同的侦听器。在这种情况下,我如何选择只将B的侦听器设置为活动,而禁用A的侦听器?现在,我在B中有了一个解决方法,为a的所有侦听器显式调用
.off()
,然后调用
.on()
。snipeet代码如下所示。这多少解决了我的问题。但我不知道它是否合法,如果不合法,是否有更好的方法。谢谢

addListeners = currentUserUid => {
    // explicitly .off all existing ones
    this.state.messagesRef.off();
    this.state.channels.forEach(channel => {
      this.state.messagesRef.child(channel.id).off();
    });

    // then do .on() again
    this.state.messagesRef.on("child_added", snap => {
    ...
    }
}

我觉得你做的一切都很好。保持侦听器处于活动状态可能不会有任何真正的伤害,因为如果只有一个侦听器,那么在同一位置的两个侦听器将不会使使用的带宽增加一倍。监听器将有效地共享快照数据。

我觉得您所做的一切都很好。保持侦听器处于活动状态可能不会有任何真正的伤害,因为如果只有一个侦听器,那么在同一位置的两个侦听器将不会使使用的带宽增加一倍。监听器将有效地共享快照数据。

谢谢您的输入,道格!我很感激!谢谢你的意见,道格!我很感激!