首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改react-router路由?

如何更改react-router路由?
EN

Stack Overflow用户
提问于 2017-07-26 17:36:37
回答 2查看 184关注 0票数 2

我正在尝试根据登录状态更改路由:

代码语言:javascript
复制
  renderRouter() {
    if (loggedIn) {
      return (
        <Router>
          <Route path="/" component={Dashboard} />
        </Router>
      );
    }

    return (
      <Router>
        <Route path="/" component={Login} />
      </Router>
    );
  }

但是当状态改变时,我会收到一个警告:Warning: [react-router] You cannot change <Router routes>; it will be ignored

是否可以使用新路由重新初始化react-router?

我知道我可以使用onEnter来确保用户可以访问这个页面,但是我需要根据登录状态将不同的组件放在一个路由中,并且不想将这样的逻辑移动到组件内部。

EN

回答 2

Stack Overflow用户

发布于 2017-07-26 17:54:17

首先,您创建了两个路由器,我认为您不应该这样做。

尝试将你的路由包装在一个只在一个Switch中的Router组件中,然后使用你的“主”renderRoute道具,如果条件为真,它会重定向你,使用exact道具来确保默认情况下这个Route将匹配,注意你的"/dashboard"路由高于另一个,所以Switch可以匹配它。

结果应该是这样的:

代码语言:javascript
复制
<Router>
  <Switch>
    <Route path="/dashboard" component={Dashboard} />
    <Route 
      path="/"
      exact
      render={() => {
        if (loggedIn) {
          return <Redirect to="/dashboard" />;
        }

        return <Login />;
      }}
    />
  </Switch>
</Router>

别忘了导入组件。

希望这能帮上忙。

票数 2
EN

Stack Overflow用户

发布于 2017-07-27 00:22:29

我已经尝试了几次来获得所需的行为,毕竟我决定改变一种安全端点管理的方法。我的端点上的组件是非常简单的场景,它们只是合成层和一些场景模块。所以我创建了一个场景包装器:

代码语言:javascript
复制
import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import Login from '../scenes/Login';

function Scene({ children, fallback, secure, auth }) {
  if (secure === auth) {
    return children;
  }
  return React.createElement(fallback);
}

Scene.propTypes = {
  children: PropTypes.node.isRequired,
  auth: PropTypes.bool,
  fallback: PropTypes.func,
  secure: PropTypes.bool,
};

Scene.defaultProps = {
  auth: false,
  fallback: Login,
  secure: false,
};

const mapStateToProps = ({ auth }) => ({ auth });

export default connect(mapStateToProps)(Scene);

然后在仪表板场景中:

代码语言:javascript
复制
import React from 'react';
import Scene from '../modules/Scene';
import Layout from '../components/Layout';

export default function Dashboard() {
  return (
    <Scene secure>
      <Layout>
        <Module1 />
        <Module2 />
      </Layout>
    </Scene>
  );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45323043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档