javascript - React Router 4 异步渲染

标签 javascript reactjs asynchronous react-router react-router-v4

我正在遵循 React Router 4 的重定向(Auth)指南,但我在基于 ajax 返回的 promise 进行渲染时遇到问题。我不确定为什么我在 promise 中的渲染没有被返回。有人能指出我正确的方向吗?

import React from 'react';
import {
  Route,
  Redirect,
  withRouter
} from 'react-router-dom';
import HeaderContainer from '../containers/HeaderContainer';

const PrivateRoute = ({ component: Component, ...props }) => {

  const validated = (rest) => {
    props.fetchUser()
    .then(() => {
      return (
        <div>
          <HeaderContainer />
          <Component {...rest}/>
        </div>
      )
    })
    .catch(()=> {
      return (
        <Redirect to={{
          pathname: '/signin',
          state: { from: props.location }
        }}/>
      )
    }
    );
  }

  return (
    <Route {...props} render={rest => {
      return (
        <div>
          { validated(rest) }
        </div>
      )
    }}/>
  )
}

export default withRouter(PrivateRoute);

我的路线是这样的

const Root = ({ store }) => {
  return (
    <Provider store={ store }>
       <BrowserRouter onUpdate={() => window.scrollTo(0, 0)}>
          <div className="root">
            <Switch>
              <Route exact path="/signin" component={SignInContainer}/>
              <PrivateRouteContainer exact path="/" component={HomePageContainer} />
            </Switch>
          </div>
       </BrowserRouter>
    </Provider>
  )
};

最佳答案

那是因为promise不能返回值,它只返回Promise。相反,它执行回调。 Here is some explanation.

您可以重新排列代码,如下所示:

class PrivateRoute extends React.Component {
  constructor(props){
    super(props);
    this.state = {
      isFetching: true,
      isSuccess: null,
    };
  }

  componentDidMount() {
    this.props.fetchUser()
      .then(() => {
        this.setState({ isFetching: false, isSuccess: true });
      })
      .catch(()=> {
        this.setState({ isFetching: false, isSuccess: false });
      });
  }

  render() {
    const { isFetching, isSuccess } = this.state;    
    return (
      <Route {...this.props} render={rest => {
        const success = (
          <div>
            <HeaderContainer />
            <Component {...rest}/>
          </div>
        );

        const error = (
          <Redirect to={{
            pathname: '/signin',
            state: { from: this.props.location }
          }}/>
        );

        if(isFetching) {
          return null;
        }

        return isSuccess ? success : error;
      }}/>
    )
  } 
}

请注意,Promise 不会返回任何内容,它只是执行一个回调,该回调会触发状态中的新数据的重新渲染。

关于javascript - React Router 4 异步渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46010592/

相关文章:

javascript - 如何从 Selenium Webdriver 获取异步 Javascript 响应

javascript - 如何在不显示屏幕键盘的情况下专注于文本输入

javascript - 如何将函数的结果存储在同一个对象中?

javascript - 如何在没有文本字段的情况下使用 JavaScript 调用 android 键盘?

javascript - 使用 React 进行输入屏蔽

angular - 在 Angular 2 中使用异步/等待功能

javascript - 如何在画廊 View 中的一系列动态 div 中使用 Jquery 更改最后一个弹出窗口(动态)的位置

javascript - 每个对象在对象数组中都应该至少有一个真实的属性值?

reactjs - react : How to add custom properties to html elements

javascript - 我怎样才能让 redux 派发一个 Action 并返回一个 promise ?