【发布时间】: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?添加到<Route />组件中的path属性,useParams()将不会返回任何东西,除了{ context: 1234 }。所以在这个假的例子中,我希望useParams()应该返回{ goodbye: 'goodbye' } -
@MaxMillington 是的。明白了。
标签: javascript reactjs react-router react-router-dom react-router-v4