【问题标题】:React Router with optional path parameter带有可选路径参数的反应路由器
【发布时间】:2016-06-06 21:19:15
【问题描述】:

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

http://localhost/app/path/to/page http://localhost/app/path/to/page/pathParam

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

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

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

编辑#1:

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

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

我的 react-router 版本是:1.0.3

【问题讨论】:

    标签: javascript reactjs react-router react-router-v4


    【解决方案1】:

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

    例如。

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        以下是相关文档:

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

        对于 react-router V5 及更高版本多路径

        使用以下语法
        <Route
                  exact
                  path={[path1, path2]}
                  component={component}
                />
        

        【讨论】:

          【解决方案5】:

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

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

          现在,url 可以是:

          1. /节
          2. /section/page/1
          3. /section/page/1/sort/asc

          【讨论】:

          • 谢谢,对我来说是完美的答案,因为我正在尝试使用 react router v4 在 URL 中找出可选的“目录路径”。
          • 有什么方法可以支持:“/section//1/”页面被忽略/可选。
          【解决方案6】:

          您发布的编辑对旧版本的 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 Router 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
          • 谢谢。它在我的情况下帮助了我
          猜你喜欢
          • 1970-01-01
          • 2015-12-22
          • 2017-05-27
          • 1970-01-01
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          • 2023-03-03
          相关资源
          最近更新 更多