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はダッシュボード内でレンダリングする必要があるため、SearchDashboardは正しくレンダリングされません。

「app」ルート内のDefaultRouteがルート「searchDashboard」を指すようにしたいと思います。これはReact Routerでできることですか、それとも通常のJavascript(ページリダイレクト用)を使用する必要がありますか?

基本的に、ユーザーがホームページにアクセスした場合は、代わりに検索ダッシュボードに送信します。だから私は同等のReact Router機能を探していると思いますwindow.location.replace("mygreathostname.com/#/dashboards/searchDashboard");


1
DefaultRouteの代わりにRedirectを使用してみましたか?<Redirect from = "/" to = "searchDashboard" />
Jonatan LundqvistMedén2015

@JonatanLundqvistMedénそれがまさに私が探していたものです、ありがとう!答えとして書いてください。正解としてマークします。返信が遅れて申し訳ありません。
Matthew Herbst、2015

回答:


148

DefaultRouteの代わりにRedirectを使用できます

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

Ogglasのおかげで、更新の問題を回避するために2019-08-09を更新してください。代わりにこれを使用してください

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

6
それは私だけですか、またはこれを使用して深いURLを直接ヒットする場合、ヒットしようとしているルートではなく、常に「to」URLにリダイレクトされますか?
Pablote

あなたには、いくつかのリダイレクトを行っている場合のようなことに注意すべきであるfrom='/a' to='/a/:id'あなたが使用する必要があります、<Switch>あなた含める<Redirect><Route>反応し、ルータからコンポーネントを。詳細はdocを
Kulbear

1
@Kulbear私も同じ問題を抱えていました。オグラスが彼の答えで言ったことをすることはうまくいきました。
アランP.

2
これを機能させるには、このルートを最後に配置するか、これを実行する必要があります<Redirect exact from="/" to="/adaptation" />
DarkWalker

監視するのは簡単なので、繰り返します。DarkWalkerのリダイレクトルールの重要な部分はexactフラグです。アクセプターの回答にはそれが欠けているため、[ほぼ]どのルートにも一致します。
デューブ

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} />

ただし、これにより、同じコンポーネントをレンダリングする2つの異なるパスが作成されます。この無意味ですが、あなたはスタイリングされた場合には、つまり、あなたの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ですか?
Matthew Herbst

1
意味がありません。私はそれを主張していないことを明確にするために私の回答を編集しました。
Seth

これも私がやっていることですが/、たとえばにリダイレクトする代わりに、コンポーネント(私のホームページ)を提供するソリューションが好き/homeです。
ericsoco 16

<IndexRoute>結局私が探しているように見えます。騒音でごめんなさい。stackoverflow.com/questions/32706913/...の github.com/reactjs/react-router/blob/master/docs/guides/...
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より前のバージョンでした。これが他の人に役立つことを願っています!
Matthew Herbst、2015年

これはあなたが文脈を失う原因になると思います。SearchDashboardホームページにDashboardアクセスしたときに表示されるコンポーネントですが、直接にアクセスした場合、それをラップするコンポーネントではありません/dashboard/searchDashboard。React-routerは、URLに一致するルートに基づいてネストされたコンポーネントの階層を動的に構築するため、ここではリダイレクトが本当に必要だと思います。
Stijn de Witt 2016

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

1

推奨される方法は、反応ルーターのIndexRoutesコンポーネントを使用することです

次のように使用します(上記のリンクされた反応ルータードキュメントから取得):

<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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.