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

Che*_*arg 82 javascript path url-routing reactjs react-router

我在三个不同的路线上使用相同的组件:

<Router>
    <Route path="/home" component={Home} />
    <Route path="/users" component={Home} />
    <Route path="/widgets" component={Home} />
</Router>
Run Code Online (Sandbox Code Playgroud)

无论如何要结合它,就像:

<Router>
    <Route path=["/home", "/users", "/widgets"] component={Home} />
</Router>
Run Code Online (Sandbox Code Playgroud)

Cam*_*ron 93

至少对于react-router v4,它path可以是一个正则表达式字符串,所以你可以这样做:

<Router>
    <Route path="/(home|users|widgets)/" component={Home} />
</Router>
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,它有点冗长,所以如果你的component/ route很简单,这可能是不值得的.

当然,如果这实际上经常出现,你总是可以创建一个包含数组paths参数的包装组件,它可以.map重复使用正则表达式或逻辑.

  • 好主意@Cameron.我发现稍微修改它以匹配仅以其中一个组开头的路径是有用的:`/ ^\/(home | users | widgets)/`现在,`/ widgets`将匹配,但是`/ dashboard/widgets `不会匹配. (5认同)
  • 应该很棒,但是现在类型正则表达式对于prop-types验证无效:`警告:失败的prop类型:提供给`Route`的类型`regexp`的无效prop`path`,期望的`string`. (3认同)
  • 不适用于 ```path={`/(${ROUTES.HOME}|${ROUTES.HOME_1})/`}``` (2认同)

Ben*_*ith 71

从react-router v4.4开始,您现在可以指定一个解析为组件的路径数组,例如

<Router>
    <Route path={["/home", "/users", "/widgets"]} component={Home} />
</Router>
Run Code Online (Sandbox Code Playgroud)

数组中的每个路径都是正则表达式字符串.

可以在此处找到此方法的文档.

  • 我相信这是最好的答案。@Cameron的答案无论如何都不支持完整的正则表达式功能(至少我做不到)。 (3认同)
  • 如何为单个路径设置 `exact` 属性? (3认同)
  • @JulianSoto 使用单个路径和确切路径创建到组件的路由。然后,您可以使用一组没有确切属性的路径创建另一个指向同一组件的路由。 (2认同)

Chr*_*che 38

我不认为这是不幸的.

您可以map像使用任何其他JSX组件一样使用a :

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

编辑

只要路径到regexp支持,你也可以使用regex作为react-router v4中的路径.有关详细信息,请参阅@ Cameron的答案.

  • 请注意,从路径切换时会导致(意外的??)重新安装(例如/ home =>/users) (7认同)
  • 不要忘记`key`道具. (2认同)

bas*_*bas 22

从 React Router v6 开始,他们删除了正则表达式的选项,根据类型定义,它又是这样path: string。目前,为了方便起见,您必须再次拼写每条路径或使用地图:

<Routes>
    {['home', 'users', 'widgets'].map(path => <Route path={path} element={<Home />} />)}
</Routes>
Run Code Online (Sandbox Code Playgroud)

另请参阅https://reactrouter.com/docs/en/v6/upgrading/v5#note-on-route-path-patterns

  • 真的吗??卧槽…… (5认同)

Abh*_*hek 7

从 react-route-dom v5.1.2 开始,您可以传递多个路径,如下所示

 <Route path={"/home" | "/users" | "/widgets"} component={Home} />
Run Code Online (Sandbox Code Playgroud)

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

  • @AzizStark你是对的,这不是一个正确的答案。最好使用 `&lt;Route path={["/home", "/users", "/widgets"]} component={Home} /&gt;` 作为解决方案。 (5认同)
  • 有用!但我收到警告:失败的道具类型:提供给“Route”的道具“path”无效。 (2认同)

San*_*ues 6

使用react-router v6,你可以这样做:

<Routes>
  {['path1', 'path2'].map((path) => (
            <Route key={--> you should use some unique key <--} path={path} element={<SomeComponent />} />
  ))}
</Routes>
Run Code Online (Sandbox Code Playgroud)

反应路由器文档说:

React Router v6 使用简化的路径格式。<Route path>在 v6 中仅支持 2 种占位符:动态:id样式参数和*通配符。

https://reactrouter.com/docs/en/v6/upgrading/v5#note-on-route-path-patterns

  • 对于 v6 这不起作用 (5认同)
  • @Nathan,我很抱歉,但我不这么认为。 (4认同)
  • 好的 np,但现在我们使用的是 V6,这也在你的标题中 (2认同)