如何在React Router中将DefaultRoute设置为另一个路由


98

我有以下内容:

  <Route name="app" path="/" handler={App}>
    <Route name="dashboards" path="dashboards" handler={Dashboard}>
      <Route name="exploreDashboard" path="exploreDashboard" handler={ExploreDashboard} />
      <Route name="searchDashboard" path="searchDashboard" handler={SearchDashboard} />
      <DefaultRoute handler={DashboardExplain} />
    </Route>
    <DefaultRoute handler={SearchDashboard} />
  </Route>

使用DefaultRoute时,由于任何* Dashboard需要在Dashboard中呈现,因此SearchDashboard呈现不正确。

我想在“应用”路由内将DefaultRoute指向路由“ searchDashboard”。这是我可以使用React Router进行的操作,还是应该为此使用常规Javascript(用于页面重定向)?

基本上,如果用户转到主页,我想将其发送给搜索仪表板。所以我想我正在寻找一个等效于React Router的功能window.location.replace("mygreathostname.com/#/dashboards/searchDashboard");


1
您是否尝试过使用重定向而不是DefaultRoute?<将重定向从=“ /”重定向到=“ searchDashboard” />
Jonatan LundqvistMedén2015年

@JonatanLundqvistMedén正是我想要的,谢谢!将其写为答案,我将其标记为正确。回复较晚,抱歉。
马修·赫伯斯特

Answers:


148

您可以使用Redirect代替DefaultRoute

<Redirect from="/" to="searchDashboard" />

更新2019-08-09为避免刷新问题,请改用此,这要感谢Ogglas

<Redirect exact from="/" to="searchDashboard" />

6
是我一个人,还是使用它直接命中一个深层URL,我总是被重定向到“到” URL,而不是我要命中的路由?
Pablote '17

应该注意的是,如果您正在执行某些重定向,例如from='/a' to='/a/:id',则需要使用<Switch>来包含来自react-router的<Redirect><Route>组件。详细信息请参见doc
Kulbear

1
@Kulbear我有同样的问题。遵照Ogglas的回答行之有效。
艾伦·

2
为了使它可行,您很可能需要将此路线放在最后或这样做<Redirect exact from="/" to="/adaptation" />
DarkWalker

很容易进行监督,所以我重复一遍:DarkWalker的Redirect规则的重要部分是exact标志。受接受者答案缺少该答案,因此它几乎匹配任何路线。
dube

55

使用的问题<Redirect from="/" to="searchDashboard" />是,如果您使用其他URL,例如/indexDashboard,如果用户单击刷新或获得发送给他们的URL,则/searchDashboard无论如何该用户都将被重定向到。

如果您不希望用户刷新站点或发送URL,请使用以下命令:

<Route exact path="/" render={() => (
    <Redirect to="/searchDashboard"/>
)}/>

如果searchDashboard在登录后使用此命令:

<Route exact path="/" render={() => (
  loggedIn ? (
    <Redirect to="/searchDashboard"/>
  ) : (
    <Redirect to="/login"/>
  )
)}/>

37

我错误地尝试使用以下方法创建默认路径:

<IndexRoute component={DefaultComponent} />
<Route path="/default-path" component={DefaultComponent} />

但这会创建呈现相同组件的两条不同路径。这不仅没有意义,而且会导致UI出现故障,即,当您<Link/>基于样式元素时this.history.isActive()

创建默认路由(不是索引路由)的正确方法是使用<IndexRedirect/>

<IndexRedirect to="/default-path" />
<Route path="/default-path" component={DefaultComponent} />

这是基于react-router 1.0.0的。参见https://github.com/rackt/react-router/blob/master/modules/IndexRedirect.js


Route您已经处理过的东西有IndexRoute什么意义?
马修·赫伯斯特

1
没有意义,我修改了答案以明确表明我不主张这样做。
赛斯

这也是我一直在做的事情,但是我很喜欢一个解决方案,该解决方案可以在其上提供一个组件(我的主页),/而不必重定向到例如/home
ericsoco


11

乔纳森的答案似乎对我没有用。我正在使用React v0.14.0和React Router v1.0.0-rc3。这样做:

<IndexRoute component={Home}/>

因此,在马修的案子中,我相信他会想要:

<IndexRoute component={SearchDashboard}/>

来源:https : //github.com/rackt/react-router/blob/master/docs/guides/advanced/ComponentLifecycle.md


感谢您的分享。我当时使用React v0.13和React-Router的版本,所以是1.0 / rc之前的版本。希望这对别人有帮助!
马修·赫伯斯特

我认为这会使您迷失上下文。SearchDashboard将是您到达首页时将看到的Dashboard组件,但如果直接转到,则不是包装它的组件/dashboard/searchDashboard。React-router根据URL匹配的路由动态地构建嵌套组件的层次结构,因此我认为您确实需要重定向。
Stijn de Witt

6
import { Route, Redirect } from "react-router-dom";

class App extends Component {
  render() {
    return (
      <div>
        <Route path='/'>
          <Redirect to="/something" />
        </Route>
//rest of code here

这样可以使您在本地主机上加载服务器时将您重定向至/ something


5

更新:2020

无需使用重定向,只需在 path

例:

<Route exact path={["/","/defaultPath"]} component={searchDashboard} />

3

我遇到了类似的问题;如果没有路由处理程序匹配,我想要一个默认的路由处理程序。

我的解决方案是使用通配符作为路径值。即,还要确保它是您的路线定义中的最后一个条目。

<Route path="/" component={App} >
    <IndexRoute component={HomePage} />
    <Route path="about" component={AboutPage} />
    <Route path="home" component={HomePage} />
    <Route path="*" component={HomePage} />
</Route>

3

对于即将进入2017年的用户,这是具有以下特点的新解决方案IndexRedirect

<Route path="/" component={App}>
  <IndexRedirect to="/welcome" />
  <Route path="welcome" component={Welcome} />
  <Route path="about" component={About} />
</Route>

2
 <Route name="app" path="/" handler={App}>
    <Route name="dashboards" path="dashboards" handler={Dashboard}>
      <Route name="exploreDashboard" path="exploreDashboard" handler={ExploreDashboard} />
      <Route name="searchDashboard" path="searchDashboard" handler={SearchDashboard} />
      <DefaultRoute handler={DashboardExplain} />
    </Route>
    <Redirect from="/*" to="/" />
  </Route>

DefaultRoutereact-routerv4中有什么等效功能?
安东尼·孔

4
@AnthonyKong我认为是:<Route exact path="/" component={Home}/>reacttraining.com/react-router/web/example/basic
TYMG '17

1

首选方法是使用React Router的IndexRoutes组件

您可以这样使用它(取自上面链接的react router文档):

<Route path="/" component={App}>
    <IndexRedirect to="/welcome" />
    <Route path="welcome" component={Welcome} />
    <Route path="about" component={About} />
</Route>

0

从旧路由器重定向到新路由器后,您可以使用它来重定向特定的URL和呈现组件。

<Route path="/old-router">
  <Redirect exact to="/new-router"/>
  <Route path="/new-router" component={NewRouterType}/>
</Route>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.