【发布时间】:2017-08-18 13:33:24
【问题描述】:
我正在从事一个大型项目,我有一个授权系统,登录用户可以访问某些路线,而 Not Found 组件在 Logged 上提供服务出用户。问题是,当用户被标记为已登录并拥有有效令牌然后进入页面(例如 /account)时,组件 Not Found 首先呈现,然后组件 account 被正确呈现。
我有一个异步 componentDidMount,我在其中验证我的令牌,如果它有效,我设置 isLogged: true 的状态。同样在我的交换机中的每条路由上,我都在检查 isLogged 的状态,然后才发送相应的组件。
我的异步组件DidMount
{/* Username is from localstorage */}
async componentDidMount() {
if ((USERNAME != "") && (USERNAME != null)) {
const logged = await checkTheToken({'Username': USERNAME}).then((result) => {
if(result.status == 202) {
this.setState({isLogged: true});
this.setState({checking: false});
};
});
}
}
这是路由器(*假设我们正在尝试访问 /user 页面。注意我使用 react-router, react-router-dom ^4.1.1* )
if (this.state.checking) {
return null;
} else {
return (
<Router>
<Switch>
{/* This is Not Rendered First and Not Found rendered before FALSLY */}
{this.state.isLogged && <Route exact path="/user" component={() => (<User isLogged={this.state.isLogged} username={USERNAME} />)} />}
{/* This is Rendered First and Not Found is not rendering at all CORRECTLY */}
<Route exact path="/test" component={() => (<Test isLogged={this.state.isLogged} />)} />
<Route component={() => (<NotFound isLogged={this.state.isLogged} />)} />
</Switch>
</Router>
);
我认为问题出在 {this.state.isLogged && ...} 因为如果我们尝试访问 /test 组件会正确呈现而没有 未找到先渲染。
另外,我测试了所有的生命周期方法
【问题讨论】:
-
您是否尝试过在
componentWillMount中进行身份验证检查,您的组件在到达componentDidMount之前已经渲染。 -
我测试了所有的生命周期方法
-
您可能需要添加一个像
checking这样默认为true的状态字段。当您得到响应时,将成功或错误设置为checking到false。在你的渲染if(this.state.checking) return null;. -
我已根据您的评论更新了我的问题。现在根本不渲染主页
-
Home是什么?您需要将this.state({checking: ..移到if(result.status...)之外,并且如果请求有错误,您还需要将其放在您捕获的位置。因为无论您的身份验证检查的响应如何,checking都需要设置为false。如果您没有收到任何错误并且它肯定会设置状态,那么代码看起来很好。我认为您不需要在componentDidMount函数上使用async/await,因为我们正在使用状态来管理您的身份验证检查的异步性质。
标签: reactjs react-router