React-Router v4 onEnter替换

fou*_*ire 18 reactjs react-router redux-thunk

我目前正在尝试构建一个简单的react-redux应用程序,该应用程序在后端具有学生和校园数据.OnEnter以前在这里工作,但它在新的react-router中不存在.

此应用程序尝试在开始时加载初始数据,而不是在每个实际组件中执行componentDidMount.这是推荐的方法,还是有其他我不知道的模式?

/* -------------------<    COMPONENT   >------------------- */
import React from 'react';

import { BrowserRouter as Router, Route } from 'react-router-dom';
import Home from './components/Home';
import Students from './components/Students';

const Routes = ({ getInitialData }) => {
  return (
    <Router>
      <div>
        <Route exact path="/" component={Home} onEnter={getInitialData} />
        <Route path="/students" component={Students} />
        <Route path="*" component={Home} />
      </div>
    </Router>
  );
};

/* -------------------<   CONTAINER   >-------------------- */

import { connect } from 'react-redux';
import receiveStudents from './reducers/student';
import receiveCampuses from './reducers/campus';

const mapState = null;
const mapDispatch = dispatch => ({
  getInitialData: () => {
    dispatch(receiveStudents());
    dispatch(receiveCampuses());
  }
});

export default connect(mapState, mapDispatch)(Routes);
Run Code Online (Sandbox Code Playgroud)

akm*_*mey 22

我目前的解决方案是在渲染函数中添加额外的代码,而不是使用组件属性.

<Route exact path="/" render={() => {
    getInitialData();
    return <Home />;
} } />
Run Code Online (Sandbox Code Playgroud)

  • 这里的问题是,如果`getInitialData`是异步的,`<Home>`将在完成提取之前呈现.不抱怨你,这是v4实现的错误. (5认同)
  • 在我的应用程序中,我使用一些标志来显示数据正在加载并在组件中检查它.在加载过程中,指示器显示出来对我来说并不是那么糟糕 (2认同)

wol*_*anh 13

我想建议一些不同的方法.使用类继承,您可以实现自己的路由器.

import {Redirect, Route} from 'react-router';



/**
 * Class representing a route that checks if user is logged in.
 * @extends Route
 */
class AuthRequiredRoute extends Route{
  /**
   * @example <AuthRequiredRoute path="/" component={Products}>
   */
    render() {
        // call some method/function that will validate if user is logged in
        if(!loggedIn()){
            return <Redirect to="/login"></Redirect>
        }else{
          return <this.props.component />
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*Dai 9

一种解决方案是使用HOC

function preCondition(condition, WrappedComponent) {
   return class extends Component {
     componentWillMount{
          condition()
     }

      render() {
          <WrappedComponent {...this.props} />
      }
    }
}

<Route exact path="/" component={preCondition(getInitialData, Home )} />
Run Code Online (Sandbox Code Playgroud)