React Routerの同じコンポーネントの複数のパス名


113

3つの異なるルートに同じコンポーネントを使用しています。

<Router>
    <Route path="/home" component={Home} />
    <Route path="/users" component={Home} />
    <Route path="/widgets" component={Home} />
</Router>

それを組み合わせるためにとにかくありますか?

<Router>
    <Route path=["/home", "/users", "/widgets"] component={Home} />
</Router>

2
react-router 4.4.0以降、提案と非常によく似た方法でパスの配列を指定できるようになりました。ここで私の答えを参照してください
ベン・スミス

回答:


134

react-router v4.4.0-beta.4以降、およびv5.0.0で公式に、コンポーネントに解決されるパスの配列を指定できるようになりました。

<Router>
    <Route path={["/home", "/users", "/widgets"]} component={Home} />
</Router>

配列の各パスは正規表現文字列です。

このアプローチのドキュメントはここにあります


5
これが最良の答えだと思います。@Cameronの答えはとにかく完全な正規表現機能をサポートしていません(少なくとも私はそれを行うことができませんでした)。
Christopher Regner

2
exact単一のパスの属性を設定するにはどうすればよいですか?
JulianSoto

1
@JulianSoto正確なパスに沿って1つのパスを持つコンポーネントへのルートを作成します。次に、正確な属性のないパスの配列を使用して、同じコンポーネントへの別のルートを作成できます。
ベン・スミス

yarn upgrade4.3から4.4 にはできません。正式にリリースされますか?
ndtreviv

@ndtreviv反応ルーターの変更ログを見ると、この機能がv4.4.0 Beta 4でロールアウトされていることがわかります。執筆時点ではv5.5.0である最新バージョンにアップグレードすることをお勧めします。あなたは、この実行中の「糸のアップグレードが反応し、ルータ--latest」を行うことができます
ベンスミス

115

少なくともreact-router v4では、path正規表現文字列にすることができるため、次のようなことができます。

<Router>
    <Route path="/(home|users|widgets)/" component={Home} />
</Router>

あなたが見ることができるようにそれは少し冗長なので、あなたのcomponent/ routeがこのように単純であるなら、それはおそらく価値がありません。

もちろん、これが実際に頻繁に発生する場合は、配列pathsパラメーターを.map受け取るラッピングコンポーネントを常に作成できます。これにより、正規表現またはロジックが再利用可能になります。


5
素晴らしいアイデア@Cameron。グループの1つで始まるパスのみに一致するように少し変更すると便利です。/^\/(home|users|widgets)//widgetsは一致しますが、一致し/dashboard/widgetsません。
Towler

4
素晴らしいことが、今のタイプの正規表現は、プロップタイプの検証に有効ではありませんする必要がありますWarning: Failed prop type: Invalid prop タイプのPATH` regexpに供給されRoute、期待されるstring.`
ファビオ・パイヴァ

@FábioPaivaええ、私はまだルートに任意の正規表現を配置する方法を理解していません
Atav32

1
文字列として<Route path="/(new|edit)/user/:id?" ... />
挿入

2
使用しないpath={`/(${ROUTES.HOME}|${ROUTES.HOME_1})/`}
ムルタザフセイン

43

v4より前のバージョンのReact Routerを使用している場合はそうは思いません。

mapただし、他のJSXコンポーネントと同じように使用できます。

<Router>
    {["/home", "/users", "/widgets"].map((path, index) => 
        <Route path={path} component={Home} key={index} />
    )}
</Router>

編集

path-to-regexpでサポートされている限り、react-router v4のパス正規表現を使用することもできます。詳細については、@ Cameronの回答を参照してください。


3
key小道具を忘れないでください。
神経伝達物質

9
これにより、パスから切り替えたときに(望ましくない...?)再マウントが発生することに注意してください(例では/ home => / users)
Hertzel Guinness

確かに!望ましさは、おそらくユースケースとコンポーネントに依存します。再マウントしたくない場合は、私の編集に示されているようにregexpを使用するとうまくいく場合があります。
クリストファーチ

4

その他のオプション:ルートプレフィックスを使用します。/pages例えば。あなたが得るでしょう

  • /pages/home
  • /pages/users
  • /pages/widgets

そして、Homeコンポーネント内で詳細に解決します。

<Router>
  <Route path="/pages/" component={Home} />
</Router>

4

react-route-dom v5.1.2以降、以下のように複数のパスを渡すことができます

 <Route path={"/home" | "/users" | "/widgets"} component={Home} />

そして、当然のことながら、Home jsxファイルを上にインポートする必要があります。


0

React Routerのドキュメントによると、proptype 'path'は文字列型です。したがって、ルートコンポーネントに配列をpropsとして渡す方法はありません。

ルートを変更するだけの場合は、同じコンポーネントを別のルートに使用しても問題ありません。


1
パスが文字列の配列を受け入れるようになったため、この答えは正しくありません。この回答を参照してください。
ベン・スミス

-1

react-router v4.4以降では、以下のようにすることができます。

パスを変数に保存し、下に渡し、 '|'を使用します オペレーター。

let home = "/home" ;
let users = "/users”;
let widgets = "/widgets" ;

<Route path={ {home} | {users} | {widgets} }  component={Home} /> 

したがって、すべてのパスが一致component={Home}する場合は、必要に応じてレンダリングされます。

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