我是Reactjs的新手,我正在理解路由。在这里,我使用withRouter()
以编程方式重定向。
我认为应该是这样的流程:constructor->Willmount->render
,但目前流量为constructor->render->willMount->render
。
当我执行此代码时,会发生/login
的第一个组件,然后显示Header组件(登录组件和后面的标头)
class Main extends Component {
constructor(props) {
super(props);
this.state = { userInfo: ''};
}
async componentDidMount() {
let user = await apiGateway.getUserInfo();
console.log(' did Mount1');
if(user == null){
console.log('Redirect');
this.props.history.push('/login');
}else{
console.log('data');
this.setState({ userInfo : user.data });
}
}
render() {
const { authenticate, userInfo, onlineUser } = this.state;
console.log('main component');
return (
<div className='Main'>
<div className='Main-header'>
<Header userInfo = {userInfo}/>
</div>
</div>
);
}
}
export default withRouter(Main);
答案 0 :(得分:1)
在componentWillMount
进行api调用是不好的做法。
您不能指望api调用能够及时收到组件render
的结果。
始终在componentDidMount
进行api通话。
class Main扩展了Component {
constructor(props) {
super(props);
this.state = { userInfo: ''};
}
async componentDidMount() {
let user = await apiGateway.getUserInfo();
console.log(' did Mount1');
if(user == null){
console.log('Redirect');
this.props.history.push('/login');
}else{
console.log('data');
this.setState({ userInfo : user.data });
}
}
render() {
const { authenticate, userInfo, onlineUser } = this.state;
console.log('main component');
return (
<div className='Main'>
<div className='Main-header'>
<Header userInfo = {userInfo}/>
</div>
</div>
);
}
}