尝试在 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