【发布时间】:2021-01-11 08:35:13
【问题描述】:
如果 axios api 为空或状态最初为空,我如何有条件地重定向到页面。在下面的代码中,我使用 axios 更新状态,并且用户信息在状态中可用,但代码继续调用 http://userapi.com/login in 循环。我想要实现的是,如果用户信息状态最初为空,则重定向到登录页面并进行身份验证。
class MyComponent extends React.Component {
constructor() {
super()
this.state = {
userinfo:{}
}
}
componentDidMount(){
axios.get('http://userapi.com/user')
.then(res => {
const userinfo = res.data;
this.setState({ userinfo });
})
.catch(err => {
console.log("Fetch error", err)
})
if (Object.keys(this.state.userinfo).length === 0) {
window.location = 'http://userapi.com/login';
}
}
render() {
return (
<React.Fragment>
<Header>Welcome</Header>
</React.Fragment>
)
}
}
我可以很好地重定向,但问题在于连续循环。即使用户信息正在存储重定向被调用(发生在循环中)
【问题讨论】:
-
将你的组件包装在 withRouter Hoc 中,然后使用 props.history.push("/yourroute")
-
如果你使用的是 react-router
-
我可以很好地重定向,但问题在于连续循环。即使用户信息正在存储重定向被调用(发生在循环中)
-
正如@Sujit.Warrier 所说,使用
push方法,因为window.location = ...将进行硬导航,重新加载您的应用程序并导致所有内容重新渲染。此外,最好将此检查放在组件树的更高位置。更接近根 App 组件。Header组件检查他们是否已登录是没有意义的。甚至应该高于所有路由器的东西 -
这也意味着当您在页面之间导航时它将位于不会重新呈现的位置,这应该可以解决问题
标签: javascript reactjs