【问题标题】:Multiple Optional Params in React RouterReact Router 中的多个可选参数
【发布时间】:2021-06-14 07:14:58
【问题描述】:

我正在使用 React Router v5。

我遇到了需要支持以下用例的情况。

我有可以通过/project/1234 访问的 React 组件。但是,我还需要通过 /project/1234/hello/project/1234/goodbye. 访问同一个 React 组件。同样,这三个路由都需要导航到同一个 React 组件。

以下代码不起作用,因为据我了解,如果我导航到 /project/1234/goodbye,react-router 会将其解释为我将“再见”作为 :hello 参数的值传递,所以如果我使用 react-router 的 useParams() 钩子本身以编程方式询问参数,我会得到错误的参数值。

<Route
   path={'project/:context/:hello?/:goodbye?'}
   render={matchProps => <Project {...matchProps}/>}
/>

换句话说,如果导航到/project/1234/goodbye 然后执行:

const params = useParams()
console.log(params.hello)

params.hello 将返回“再见”

同样,这不起作用,因为使用数组,/project/1234/goodbye 将始终首先匹配 /project/1234,因此我不会使用 react-router 的 useParams() 钩子传递任何参数提供。

<Route
   path={['project/:context', 'project/:context/:hello?', 'project/:context/:goodbye?']}
   render={matchProps => <Project {...matchProps}/>}
/>

我本来可以:

<Route
   path={'project/:context'}
   render={matchProps => <Project {...matchProps}/>}
/>

但是,当我使用 react-router 的 useParams() 钩子时,我将无法询问参数 :goodbye:hello

有人知道如何使用 React Router 来实现这一点吗?还是我只需要声明单独的路线?

【问题讨论】:

  • 两个?总是一个问题。您可能应该尝试编写一个最多包含一个 ? 的路由路径。否则它怎么知道要匹配哪一个?我想你已经回答了你自己的问题。
  • 如果有人通过/project/1234/goodbye 访问您的应用程序,您究竟希望useParams() 产生什么? { goodbye: '????' }?
  • @codemonkey 这是一个人为的例子。但是如果不将:goodbye? 添加到&lt;Route /&gt; 组件中的path 属性,useParams() 将不会返回任何东西,除了{ context: 1234 }。所以在这个假的例子中,我希望useParams() 应该返回{ goodbye: 'goodbye' }
  • @MaxMillington 是的。明白了。

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


【解决方案1】:

如果我正确理解了这个问题,那么您可以这样做:

<Route path="/project/:context">
    <Project />
</Route>

这是因为您没有调用确切的路径。基本上任何以 /project/:context 开头的东西都会导航到正确的组件,即使它后面还有 10 个参数。

【讨论】:

  • 我会更新问题。你是对的,我将在所有三个路线中获得相同的组件。但是,当我使用 react-router 的 useParams() 钩子时,它不会返回 { hello: 'value', goodbye: 'value' } 参数
【解决方案2】:

更新

这是基于对要求的更好理解的更新答案。您似乎希望 hellogoodbye 实际上是 URL 参数的名称,以便您可以在呈现的组件中获取它们。

您已经非常接近完成这项工作了。

在我的示例中,我将使用参数名称 var1(而不是 hellogoodbye),以便通过使用 /project/1234/hello 访问您的应用程序,您将获得 {context: "1234", var1: "hello"} 并且此 URI /project/1234/goodbye 将产生{context: "1234", var1: "goodbye"}

你只需要这条路线:

<Route
      exact
      path={["/project/:context", "/project/:context/:var1"]}
      component={Project}
   />

然后在渲染的组件中,你可以像这样访问 URL 参数:

props.match.params

同样,这不起作用,因为使用数组,/project/1234/goodbye 将始终首先匹配 /project/1234,因此我不会使用 useParams() 钩子传递任何参数react-router 提供的。

您是绝对正确的,除非您使用exact 参数。

这是一个沙盒:https://codesandbox.io/s/react-router-5-forked-1jjwt?file=/src/index.js

【讨论】:

  • 我会更新问题。你是对的,我将在所有三个路线中获得相同的组件。但是,当我使用 react-router 的 useParams() 钩子时,它不会返回 { hello: 'value', goodbye: 'value' } 参数
  • @MaxMillington 答案已更新。
猜你喜欢
  • 2019-09-12
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 2016-10-08
  • 2021-10-25
  • 2022-01-21
  • 2018-03-20
  • 1970-01-01
相关资源
最近更新 更多