React Router中同一组件的多个路径名


113

我将相同的组件用于三种不同的路线:

<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开始,您现在可以按照与建议非常相似的方式指定路径数组。在这里查看我的答案。
本·史密斯,

Answers:


137

从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使用单个路径以及确切路径创建到组件的路由。然后,您可以使用没有精确属性的路径数组创建指向同一组件的另一个Route。
本·史密斯

我不能yarn upgrade从4.3到4.4。它正式发布了吗?
ndtreviv '19

@ndtreviv查看反应路由器更改日志,可以看到该功能已在v4.4.0 Beta 4中推出。我建议升级到最新版本,在撰写本文时为v5.5.0。您可以通过运行“ yarn upgrade react-router --latest”来执行此操作
Ben Smith,

115

至少对于react-router v4来说,它path可以是正则表达式字符串,因此您可以执行以下操作:

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

如您所见,它有点冗长,因此,如果您的component/ route像这样简单,则可能不值得。

当然,如果这种情况经常发生,您总是可以创建一个包含数组paths参数的包装组件,该组件可.map重复使用正则表达式或逻辑。


5
好主意@Cameron。我发现对它进行一些修改以仅匹配以组之一开头的路径很有用:/^\/(home|users|widgets)/ 现在/widgets可以匹配,但是/dashboard/widgets不匹配。
TOWLER

4
应该是伟大的,但对于现在的类型正则表达式是不是道具类型验证有效:Warning: Failed prop type: Invalid prop 类型的path` regexp供给Route,预计string.`
法比奥·派瓦

@FábioPaiva是的,我仍然没有弄清楚如何在路线中放置任意正则表达式
Atav32 '18

1
将其作为字符串放入<Route path="/(new|edit)/user/:id?" ... />
medv '18

2
无法使用path={`/(${ROUTES.HOME}|${ROUTES.HOME_1})/`}
Murtaza Hussain

43

我不认为您使用的是低于v4的React Router版本。

不过,您可以map像对待其他任何JSX组件一样使用a :

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

编辑

您也可以在react-router v4中使用正则表达式作为路径只要path-to-regexp支持即可。有关更多信息,请参见@Cameron的答案。


3
不要忘记key道具。
神经递质

9
请注意,从路径切换时(例如/ home => / users),这将导致(不必要的...?)重新安装
Hertzel Guinness

确实!可取性可能取决于您的用例和组件。如果您不想重新安装,请按照我的编辑中的指示使用regexp可能会更好。
Christopher Chiche '18年

5

从react-route-dom v5.1.2开始,您可以通过以下多个路径

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

很显然,您需要在顶部导入Home jsx文件。


4

其他选项:使用路由前缀。/pages例如。你会得到

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

然后在Home组件内部以详细方式解决它。

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

0

根据React Router docs,属性类型“ path”的类型为字符串。因此,您无法将数组作为属性传递给路由组件。

如果您只想更改路线,则可以将同一组件用于不同的路线,这没有问题


1
由于路径现在可以接受字符串数组,因此该答案不再正确。看到这个答案
本·史密斯

-1

从react-router v4.4开始,您可以在下面执行以下操作。

将路径存储在变量中,然后向下传递并使用“ |” 操作员。

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

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

因此,对于所有匹配的路径,它将呈现component={Home}您需要的..

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.