开发者问题收集

尝试在 React Web 应用中呈现 Firebase Auth 详细信息并返回“未定义”

2020-10-27
547

我试图在从我的 Firebase Auth 中存储的内容加载“个人资料页面”时呈现用户的 displayName 和电子邮件。

我在“componentDidMount”中通过设置与来自 Firebase 的响应相关的状态来执行此操作。

但奇怪的是,当页面加载时以及每次刷新时,响应都是“未定义”。但是,如果我以任何方式更改代码,保存然后重新加载,数据就会根据需要提取并呈现在我的输入中。

发生这种情况的一个例子是,如果我在代码中添加“控制台日志”,保存然后刷新 - 数据将开始呈现,并且它也会记录而不是返回“未定义”。

我不完全确定我做错了什么,我试图在我的 componentDidMount 中添加一个 async/await,但无济于事。

这是我的组件:

class Profile extends Component {
  constructor(props) {
    super(props);

    this.state = {
      displayName: "",
      email: "",
    };
  }

  async componentDidMount() {
    var user = await firebase.auth().currentUser;
    var name, email;

    if (user != null) {
      if (user.displayName !== "") {
        name = user.displayName;
      } else {
        name = "";
      }

      if (user.email !== "") {
        email = user.email;
      } else {
        name = "";
      }
    }

    console.log(name);
    console.log(email);

    return this.setState({
      displayName: name,
      email: email,
    });
  }

  onChange = (e) => {
    this.setState({ [e.target.name]: e.target.value });
  };

  render() {
    return (
      <div>
        <input
          className="profile-info-type"
          type="text"
          name="displayName"
          value={this.state.displayName || ""}
          onChange={this.onChange}
        />

        <input
          className="profile-info-type"
          type="email"
          name="email"
          value={this.state.email || ""}
          onChange={this.onChange}
        />
      </div>
    );
  }
}

任何反馈都将不胜感激。

编辑:更新的 componentDidMount 调用:

 componentDidMount() {

    firebase.auth().onAuthStateChanged(function(user) {
    if (!user) {
      this.setState({
        displayName: "",
        email: ""
      })
    } else {
        this.setState({
          displayName: user.displayName,
          email: user.email
        })
    }
  });

  }
1个回答

首先, firebase.auth().currentUser 不是异步的,因此使用 await 在这里没有帮助。它不会等待当前用户对象可用。事实上,当页面首次加载时, currentUser 最初为 null。在 Firebase Auth 确定当前用户对象有效后,该对象才会可用。

要找出用户对象何时首次可用,您根本不应该使用 currentUser。您应该使用 身份验证状态观察器 在用户的身份验证状态发生变化时接收回调:

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // User is signed out.
  }
});

当发生这种情况时,您需要安排对 setState 的调用,以便更新 UI。

我还建议您阅读有关 为什么 currentUser 意外为空 的更多信息。

Doug Stevenson
2020-10-27