使用withRouter()

时间:2018-04-25 13:25:41

标签: javascript node.js reactjs react-router-v4

我是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);

1 个答案:

答案 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>
          );
        }

   }