ChatGPT解决这个技术问题 Extra ChatGPT

带有可选路径参数的反应路由器

我想声明一个带有可选路径参数的路径,因此当我添加它时,页面会做一些额外的事情(例如填充一些数据):

http://localhost/app/path/to/page <= 渲染页面 http://localhost/app/path/to/page/pathParam <= 根据 pathParam 用一些数据渲染页面

在我的反应路由器中,我有以下路径,以支持这两个选项(这是一个简化的示例):

<Router history={history}>    
   <Route path="/path" component={IndexPage}>
      <Route path="to/page" component={MyPage}/>
      <Route path="to/page/:pathParam" component={MyPage}/>
   </Route>    
</Router>

我的问题是,我们可以在一条路线上声明它吗?如果我只添加第二行,则找不到没有参数的路由。

编辑#1:

here 提到的关于以下语法的解决方案对我不起作用,它是正确的吗?它是否存在于文档中?

<Route path="/product/:productName/?:urlID?" handler={SomeHandler} />

我的反应路由器版本是:1.0.3

v6:React 路由器似乎在 v6 中放弃了对可选路径参数的支持,请参阅 github.com/remix-run/react-router/issues/…(以及其中的讨论)。

C
Community

您发布的编辑对旧版本的 React-router (v0.13) 有效,并且不再起作用。

React 路由器 v1、v2 和 v3

从版本 1.0.0 开始,您定义可选参数:

<Route path="to/page(/:pathParam)" component={MyPage} />

对于多个可选参数:

<Route path="to/page(/:pathParam1)(/:pathParam2)" component={MyPage} />

您使用括号 ( ) 包裹路由的可选部分,包括 前导斜杠 (/)。查看官方文档的 Route Matching Guide 页。

注意: :paramName 参数匹配到下一个 /?# 的 URL 段。有关路径和参数的详细信息,请参阅read more here

React 路由器 v4 及更高版本

React Router v4 与 v1-v3 根本不同,可选的路径参数也没有在 official documentation 中明确定义。

相反,系统会指示您定义一个 path-to-regexp 可以理解的 path 参数。这为定义路径提供了更大的灵活性,例如重复模式、通配符等。因此,要将参数定义为可选参数,请添加尾随问号 (?)。

因此,要定义可选参数,您可以:

<Route path="/to/page/:pathParam?" component={MyPage} />

对于多个可选参数:

<Route path="/to/page/:pathParam1?/:pathParam2?" component={MyPage} />

注意: React Router v4 不兼容 (read more here)。请改用 v3 或更早版本(推荐 v2)。


这仍然是关于 URL 中多个可选参数的问题,例如 /route(/:category/(:article)
@AlexShwarc,好点,谢谢。我添加了代码来演示多个可选参数。看一看。
@Chris我敢肯定,它不能这样工作,你检查过吗?
我可以创建主路由的可选路径参数吗?例如,我需要在路径中添加语言参数,我的主页 url 将是“/”和“/en”Here is demo
@chris 可能想要为 v6 更新这个答案......似乎不支持可选路径参数。请参阅github.com/remix-run/react-router/issues/…
A
Akash Kumar Verma

对于搜索后到达此处的任何 React Router v4 用户,<Route> 中的可选参数用 ? 后缀表示。

以下是相关文档:

https://reacttraining.com/react-router/web/api/Route/path-string

path: string path-to-regexp 理解的任何有效 URL 路径。

    <Route path="/users/:id" component={User}/>

https://www.npmjs.com/package/path-to-regexp#optional

可选的

参数可以用问号 (?) 作为后缀,以使参数可选。这也将使前缀可选。

可以使用或不使用页码访问的站点的分页部分的简单示例。

    <Route path="/section/:page?" component={Section} />

@user2928231 谢谢,更新了他们的新文档网址。据我所知,<Match pattern /> 现在又是 <Route path />,但问号后缀仍然是现在处理可选参数的方法。
你好!我仍然有可选参数的问题并且无法使下一个路由工作:我有 playersplayers/123players/123/editplayers?unseen=true。可选参数 ?unseen 对我不起作用。尽管我尝试了此讨论中的所有修复。您能否提供正确的路径字符串来处理这个问题?提前致谢!
嗨@KhrystynaSkvarok,你有没有想过如何让你的路径使用可选的查询字符串工作?我正在尝试做同样的事情
@sabliao 嗨!我没有可用的示例,但对于像 example.com/search?query=test 这样的 URL,请尝试使用下一个模式 /:search(search)
如何在分隔符后从 url 获取参数?
N
Nebojsa Sapic

多个可选参数的工作语法:

<Route path="/section/(page)?/:page?/(sort)?/:sort?" component={Section} />

现在,url 可以是:

/section /section/page/1 /section/page/1/sort/asc


谢谢,对我来说是完美的答案,因为我试图用反应路由器 v4 找出 URL 中的可选“目录路径”。
有什么方法可以支持:“/section//1/”页面被忽略/可选。
S
Sayak Chakraborty

好吧,既然您提到您的 react-router 版本为 1.0.3,您可以在之前的答案中找到您的解决方案。

但是,从 React Router v6 开始,该选项已被删除,如前所述。 here

因此,对于 React Router v6,以下内容:

} />

将被替换为:

} /> } />

或者您也可以使用:

} /> } />


虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
N
Nishant Singh

对于 react-router V5 及更高版本,请使用以下多路径语法

<Route
          exact
          path={[path1, path2]}
          component={component}
        />

我认为这不适用于 React Router v6 ..
V
Vikas Benvanshi

与常规参数一样,声明可选参数只是 Route 的 path 属性的问题;任何以问号结尾的参数都将被视为可选参数:

<Route path="to/page/:pathParam?" component={MyPage}/>

T
Thenlie

正如 Sayak 所指出的,可选参数已从 React Router V6 中删除。我发现的最简单的解决方案是只制作两条路线。一个用于不带参数的 url,另一个用于:

<Route path="/product/:productName/" handler={SomeHandler} />
<Route path="/product/:productName/:urlID" handler={SomeHandler} />

由于可选参数已被删除,您如何使用“?”在你的路上?
感谢您指出了这一点。那实际上是一个错字。如果没有第三个参数,则第一条路径呈现,第二条路径在有第三个参数时呈现。
i
inostia

如果您希望进行完全匹配,请使用以下语法:(param)?

例如。

<Route path={`my/(exact)?/path`} component={MyComponent} />

这样做的好处是您可以使用 props.match,而且您不必担心检查可选参数的值:

{ props: { match: { "0": "exact" } } }