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

Firebase Auth的OnAuthState中的React的SetState已更改,导致SetState未定义

东门奕
2023-03-14

//为什么这个问题不是(如何在回调中访问正确的“this”?):我的问题是一个特定于反应的问题,访问者可能不会在精神上将上述链接中提出的问题与我正在努力解决的问题联系起来。

我正在尝试存储Firebase auth的onAuthStateChanged函数返回的用户数据,并将该数据存储在状态中,以便在我的react应用程序中使用它。在我的应用程序中,我有以下监听器:

  componentDidMount() {

    firebase.auth().onAuthStateChanged(function(user) {

      var theUser;

      if (user) {
        console.log("user is logged in!");

        theUser = user;

        this.setState({
          session: theUser
        });
        // User is signed in.
      } else {
        // No user is signed in.
        console.log("user is not logged in!")
        theUser = null;
      }
  }
}

但是我得到错误“TypeError:this.setState不是一个函数”。我尝试过将“this”绑定到conceptDidMount,但无济于事。

共有2个答案

殷德本
2023-03-14

JavaScript中的“this”可能有点难,你必须确定你知道它指的是什么。因为“this”在“function(user)”的内部,所以它是相对于那个函数的...而不是整个应用程序。我必须看到你的全部代码才能确定,但是你可以做类似这样的事情来保存你的应用程序的一个引用并使用它。

 let myApp = this;

 componentDidMount() {

    firebase.auth().onAuthStateChanged(function(user) {

      var theUser;

      if (user) {
        console.log("user is logged in!");

        theUser = user;

        myApp.setState({
          session: theUser
        });
        // User is signed in.
      } else {
        // No user is signed in.
        console.log("user is not logged in!")
        theUser = null;
      }
  }
}
曹沛
2023-03-14

正如@Jason Byrne所说,指定谁是“这个”似乎是一个问题,你可以遵循他在答案中提到的方法。

另一种现代方法是使用ES6箭头函数,因为它们在词法范围中工作,因此this取决于编写它的“位置”(这是您的):

componentDidMount() {

    firebase.auth().onAuthStateChanged(user => {

      var theUser;

      if (user) {
        console.log("user is logged in!");

        theUser = user;

        this.setState({
          session: theUser
        });
        // User is signed in.
      } else {
        // No user is signed in.
        console.log("user is not logged in!")
        theUser = null;
      }
  }
}

看看这里:如何在回调中访问正确的“this ”?

 类似资料:
  • 我得到了 错误:超过最大更新深度。当组件在componentWillUpdate或componentDidUpdate内重复调用setState时,可能会发生这种情况。React限制嵌套更新的数量,以防止无限循环。 但我读到的内容应该能够在componentDidMount中调用setState而不会出错。 }

  • 是否可以使用更新对象的属性? 类似于: 我试过: 还有这个: 第一个会导致语法错误,而第二个则什么也不做。有什么想法吗?

  • 问题内容: 在我的react组件中,我试图在ajax请求进行时实现一个简单的微调器-我使用状态来存储加载状态。 由于某种原因,我的React组件下面的这段代码抛出此错误 只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了setState()。这是无人值守。请检查未定义组件的代码。 如果我摆脱了第一个setState调用,错误就会消失。 问题是,当应该已经安装了组件时(为什么从co

  • 我正在尝试使用DidMount中的localStorage值更新状态,但它没有更新: 在第一个console.log中,我的值为1,在第二个中,它保持为空,不更新状态。