使用 useParams() 钩子获取多个 URL 参数

Arn*_*ave 5 url-parameters reactjs react-router react-hooks react-functional-component

我正在尝试使用 React-Router 5.1 和函数组件中的 useParams 钩子在 url 中传递多个参数。

但是我遇到了非常奇怪的行为。

我将网址粘贴到客户端。

网址:

 http://localhost:3000/onboarding/eventId=5e9a173f9166f800128c04d1&groupId=5e9a173f9166f800128c04dc&userId=5e9a173f9166f800128c04da 
Run Code Online (Sandbox Code Playgroud)

小路:

<Route path = '/onboarding/:eventId?/:groupId?/:userId?' exact component = {OnboardingViewController} />
Run Code Online (Sandbox Code Playgroud)

奇怪的事情#1:我必须将参数设为可选,否则浏览器会永远挂起。

我使用所有这些策略将它们找出来:

    var   {  eventId, groupId, userId } = useParams();
    var   {  eventId } = useParams();
    var   {  groupId } = useParams();
    var   {  userId  } = useParams();

Run Code Online (Sandbox Code Playgroud)

奇怪的事情#2:不幸的是,当尝试使用这些参数时,会发生这种情况:

{userId: undefined, eventId: "eventId=5e9a173f9166f800128c04d1&groupId=5e9a173f9166f800128c04dc&userId=5e9a173f9166f800128c04da", groupId: undefined}
Run Code Online (Sandbox Code Playgroud)

钩子只接受第一个参数并首先将其余部分解释为 te 的一部分。

奇怪的事情 #3:由于添加这个 url params 查询访问页面加载非常慢,需要几秒钟。

我没有看到什么,做错了什么?

回答:

我做错了什么:我使用的是 url/eventId=123。这是错误的。您只需要在 URL url/1/2/3 中的正确位置提供资源。

正确的:

http://localhost:3000/onboarding/5e9aaf4fc27583001190834e/5e9aaf60c275830011908361/5e9aaf4fc275830011908357
Run Code Online (Sandbox Code Playgroud)

然后告诉路由器这些东西将被称为 eventId & groupId & userId。

 <Route path = '/onboarding/:eventId/:groupId/:userId' exact component = {OnboardingViewController} />
Run Code Online (Sandbox Code Playgroud)

然后您可以使用 userPrams() 钩子在组件中访问这些。

var  { eventId,  groupId, userId } = useParams();
Run Code Online (Sandbox Code Playgroud)

谢谢大家!

Adr*_*njo 12

您的路线结构和路线不匹配

如果你想在你的 URL 中使用 params 是 http://localhost:3000/onboarding/5e9a173f9166f800128c04d1/5e9a173f9166f800128c04dc/5e9a173f9166f800128c04da

你的路线组件将是:

<Route path = '/onboarding/:eventId/:groupId/:userId' exact component = {OnboardingViewController} />
Run Code Online (Sandbox Code Playgroud)

然后你可以在OnboardingViewController组件中使用它:

 var   {  eventId, groupId, userId } = useParams();
 console.log(eventId,groupId,userId)
Run Code Online (Sandbox Code Playgroud)


Dre*_*ese 5

您将匹配参数与 URL 查询参数混淆了。

location可以使用以下方法从对象中检索 URL 查询参数useLocation

给定网址http://localhost:3000/onboarding/?eventId=5e9a173f9166f800128c04d1&groupId=5e9a173f9166f800128c04dc&userId=5e9a173f9166f800128c04da

{
  pathname: '/onboarding/',
  search: '?eventId=5e9a173f9166f800128c04d1&groupId=5e9a173f9166f800128c04dc&userId=5e9a173f9166f800128c04da'
}
Run Code Online (Sandbox Code Playgroud)

需要一条路线path="/onboarding/"不过

您可以使用 QueryParameter 处理库将它们转换为地图对象。

如果您可以将 URL 修改为以下形式: http://localhost:3000/onboarding/5e9a173f9166f800128c04d1/5e9a173f9166f800128c04dc/5e9a173f9166f800128c04da

然后路由path='/onboarding/:eventId/:groupId/:userId'可以匹配返回的路径参数useParams

const { eventId, groupId, userId } = useParams();
Run Code Online (Sandbox Code Playgroud)