【发布时间】:2019-12-18 11:16:48
【问题描述】:
我正在关注一个身份验证教程,我正在尝试理解这一点:
componentDidMount() {
this.props.firebase.auth.onAuthStateChanged(authUser => {
authUser
? this.setState({ authUser })
: this.setState({ authUser: null });
});
}
如果在组件渲染之后调用componentDidMount(),为什么要在渲染之后调用评估用户是否登录的函数?
我认为这样做的结果是:
- React 呈现未经身份验证的页面
- 之后,它会评估用户是否已通过身份验证
- 最终渲染出认证页面
代替:
- 评估用户是否通过身份验证
- 呈现经过身份验证的页面
你能说我在周期的哪个部分错了吗?
我知道componentDidMount()是用来不阻塞页面渲染的流程,但是如果用户之前有一个会话,然后再次进入该网站,他将无法访问私有页面,直到呈现公共页面并调用onAuthStateChanged()。
【问题讨论】:
-
您在“评估用户是否已通过身份验证”这一步是错误的。它实际上分为两个步骤(发送请求/接收响应):1. 发送请求以评估(这里你呈现加载器) 2. 接收 ok 响应(这里你呈现经过身份验证的页面) 3. 接收错误响应(这里你重定向到登录页面)
-
如果您考虑将 componentWillMount 用于该用例 read react docs about why you shouldn't do it。
-
@AngelLuis 我不确定我是否理解你。你怎么能在你的页面之前加载smth?有很多方法可以进行身份验证。请描述您希望您的身份验证过程如何。
-
@Arseniy-II 所以你认为更好的方法是,例如:应用程序状态(
authUser: null, firstLoad: true),在评估用户是否登录时放置一个加载动画,更新状态,根据状态进行重定向,最后将状态firstLoad更新为false,以避免在状态会话的其余部分出现Loading动画。
标签: reactjs