【问题标题】:React-Router v4 onEnter replacementReact-Router v4 onEnter 替换
【发布时间】:2017-09-04 22:46:05
【问题描述】:

我目前正在尝试构建一个简单的 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);

【问题讨论】:

    标签: reactjs react-router redux-thunk


    【解决方案1】:

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

    <Route exact path="/" render={() => {
        getInitialData();
        return <Home />;
    } } />
    

    【讨论】:

    • 这里的问题是,如果getInitialData 是异步的,&lt;Home&gt; 将在完成获取之前呈现。不向您抱怨,这是 v4 实现的错误。
    • 在我的应用程序中,我使用一些标志来显示数据正在加载并在组件中检查它。在加载过程中显示指示器,所以对我来说还不错
    【解决方案2】:

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

    import React from 'react';
    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 />
            }
        }
    }
    

    【讨论】:

    • 不错的解决方案!但我还必须在顶部添加import React from 'react';
    • 很好的解决方案!
    • return 在 tsx 中无效。 JSX 元素类型“this.props.component”没有任何构造或调用签名。
    【解决方案3】:

    一种解决方案是使用 HOC

    function preCondition(condition, WrappedComponent) {
       return class extends Component {
         componentWillMount() {
           condition()
         }
    
          render() {
            <WrappedComponent {...this.props} />
          }
        }
    }
    
    <Route exact path="/" component={preCondition(getInitialData, Home )} />
    

    【讨论】:

    • 我真的很喜欢你的解决方案!到目前为止,你有没有发现任何缺点?看起来很完美
    • v 可以在这里进行异步调用吗?
    【解决方案4】:
    import React, { Component } from 'react';
    import { Route, Redirect } from 'react-router-dom';
    
    class LoginRoute extends Component{
        render() {
            const isLogin = () => {
                if () {
                    return true;
                }
                return false;
            }
            if(!isLogin()){
                return <Redirect to="/login"></Redirect>
            }else{
                return <Route path={this.props.path} exact component={this.props.component} />
            }
        }
    }
    
    export default LoginRoute;
    

    【讨论】:

    • @wolendranh 谢谢,它对我有用!但是this.props.history在组件中是未定义的,所以我之前改了代码
    猜你喜欢
    • 2018-01-07
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多