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

如何删除新的Firebase onAuthStateChanged监听器在反应

潘琪
2023-03-14

我正在用react路由器在react web应用程序中实现firebase auth。

用户使用弹出式登录功能使用Facebook或Google登录(at/sign),如果成功,我将路由到主应用程序(/)。在主应用程序组件中,我侦听身份验证状态更改:

  componentWillMount() {
    this.authListener = this.authListener.bind(this);
    this.authListener();
  }

authListener侦听身份验证更改:

authListener() {
    firebase.auth().onAuthStateChanged((user) => {
      if (user) {
        console.log('user changed..', user);
        this.setState({
          User: {
            displayName: user.displayName
          }
        });
      } else {
        // No user is signed in.
        browserHistory.push('/signin');
      }
    });
  }

一切正常,除了我退出(然后回到 /signin),然后用脸书或谷歌再次登录。然后我得到一个错误说:

警告:设置状态(…):只能更新已安装或正在安装的组件。

我怀疑现在卸载的上一个登录状态应用程序中的onAuthStateChanged侦听器仍在运行。

当应用程序组件卸载时,是否有方法删除onAuthStateChanged侦听器?

共有3个答案

戚英逸
2023-03-14

@Justin,因为onAuthStateChanged返回函数,所以您可以使用它来清除监听器...this.fireBaseListener=firebase.auth(). onAuthStateChanged

文档:https://firebase.google.com/docs/reference/js/firebase.auth.Auth#onAuthStateChanged

返回非空的firebase.Promise,其中包含字符串的非空数组

邓星光
2023-03-14

您设置的任何侦听器也需要拆下。

你的猜疑很准确。

您应该使用组件WillUnMount生命周期方法来删除任何可能污染应用的剩余侦听器。

要清除侦听器,以下是相关代码:

在函数中,您需要在组件中保存对监听器的引用(它会在调用firebase.auth(). onAuthStateChanged后返回给您)。它将是一个钩子,将取消引用侦听器并删除它。

因此,不要只是调用它,而是将返回的值保存为这样

this.fireBaseListener = firebase.auth().onAuthStateChanged ...

当您的组件未挂载时,请使用以下代码:

componentWillUnmount() {
   this.fireBaseListener && this.fireBaseListener();
   this.authListener = undefined;
}
隗星驰
2023-03-14

我知道我迟到了,但这里有一个基于钩子的解决方案:

React.useEffect(() => {
    const unsubscribe = firebase.auth().onAuthStateChanged((user) => { // detaching the listener
        if (user) {
            // ...your code to handle authenticated users. 
        } else {
            // No user is signed in...code to handle unauthenticated users. 
        }
    });
    return () => unsubscribe(); // unsubscribing from the listener when the component is unmounting. 
}, []);
 类似资料:
  • 问题内容: 无论如何,要删除这样添加的事件侦听器: 不更换元素? 问题答案: 除非您在创建时存储了对事件处理程序的引用,否则无法彻底删除事件处理程序。 我通常会将它们添加到该页面上的主要对象中,然后在处理完该对象后可以对其进行迭代和清理。

  • 问题内容: 我在反应中有更高阶的组件是这样的: 卸载通过包装的组件后,它们仍然会抛出错误,例如(当我滚动时): 警告:setState(…):只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了setState()。这是无人值守。请检查未定义组件的代码。 即使确实删除了组件卸载中的事件。没用 但是当我将代码更改为这样时: 一切似乎都正常,没有任何问题。 我觉得它们是完全一样的,但是

  • 本文向大家介绍Javascript添加监听与删除监听用法详解,包括了Javascript添加监听与删除监听用法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Javascript添加监听与删除监听的用法。分享给大家供大家参考。具体分析如下: js中事件监听就是利用addEventListener来绑定一个事件,这个用法在jquery中非常常用并且简单,但在原生js中比较复杂,这里整理了

  • 问题内容: 一个典型的Redis聊天示例将如下所示(仅举一个这样的示例,请参见https://github.com/emrahayanoglu/Socket.io- Redis-RealTime-Chat- Example/blob/master/chatServer.js ): 但是,这里的问题是,当“断开连接”时,侦听器仍然处于连接状态。控制台将继续打印出。如果要检查的事件列表,他们仍然会发现

  • 问题内容: https://docs.angularjs.org/guide/directive 通过侦听此事件,可以删除可能导致内存泄漏的事件侦听器。注册到范围和元素的侦听器在销毁时会自动清除,但是如果您在服务上注册了侦听器,或者在未删除的DOM节点上注册了侦听器,则必须自己清理或您可能会引入内存泄漏的风险。 最佳实践:指令应自行清理。删除指令后,可以使用element.on(’$ destro

  • 在iOS中,当视图控制器消失时删除监听器是一个很好的做法。那么在Android世界也是这样吗?是否应该删除活动的中的所有侦听器