微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

React Router 中的多个可选参数

如何解决React Router 中的多个可选参数

我使用的是 React Router v5。

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

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

以下代码不起作用,因为据我所知,如果我导航到 /project/1234/goodbye,react-router 会将其解释为我将 'goodbye' 作为 :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,因此我不会使用 {{1}由 react-router 提供的钩子。

useParams()

我本来可以:

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

但是,当我使用 react-router 的 <Route path={'project/:context'} render={matchProps => <Project {...matchProps}/>} /> 钩子时,我将无法查询参数 useParams():goodbye

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

解决方法

更新

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

您已经非常接近实现这一目标了。

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

您只需要这条路线:

{context: "1234",var1: "goodbye"}

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

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

同样,这也行不通,因为使用数组,/project/1234/goodbye 将始终首先匹配 /project/1234,因此我不会使用 useParams() 钩子传递任何参数反应路由器提供的。

您完全正确,除非您使用 props.match.params 参数。

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

,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。