如何在不指定密钥的情况下使用 React-Router-DOM v6 `useSearchParams` 获取所有查询参数?

How to get all query params using React-Router-DOM v6 `useSearchParams` without specifying the key?

我目前正在使用 react-router-dom v6 开发一个 React 项目,我想获取所有查询参数。

http://localhost:3000/users?page=5&pageSize=25

我想同时获取 page 和 pageSize。我知道我们可以使用下面的代码来获取带有键的参数。

import React from 'react'
import {useSearchParams} from "react-router-dom";

const Users = () => {

  const [searchParams, setSearchParams] = useSearchParams();

  const page = searchParams.get('page')
  const pageSize = searchParams.get('pageSize')


  return (<h1>page: {page}, pageSize: {pageSize}</h1>)
}

但是,然后我尝试使用 searchparams.getAll() 获取所有参数而不指定键,但它不起作用,React 应用程序只显示一个空白页面。

这是我用来获取所有参数的代码:

import React from 'react'
import {useSearchParams} from "react-router-dom";

const Users = () => {

  const [searchParams, setSearchParams] = useSearchParams();

  const params = searchParams.getAll();

  console.log(params)

  return (<h1>params</h1>)
}

我是不是哪里弄错了?

这是我对 package.json 的依赖:

  "dependencies": {
    ...,
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-router-dom": "^6.2.2",
    ...,
  },

URLSearchParams.getAll 仍然需要一个键,return 是该键的所有值的数组。

let url = new URL('https://example.com?foo=1&bar=2');
let params = new URLSearchParams(url.search);

//Add a second foo parameter.
params.append('foo', 4);

console.log(params.getAll('foo')) //Prints ["1","4"].

您可以使用 URLSearchParams.entries 到 return 迭代器,该迭代器可用于将条目推送到 key/value 对数组中。

示例:

const Users = () => {
  const [searchParams, setSearchParams] = useSearchParams();

  const params = [];

  for(let entry of searchParams.entries()) {
    params.push(entry);
  }

  console.log(params); // [["page", 5], ["pageSize", 25]]

  return (
    <>
      <h1>Params</h1>
      <ul>
        {params.map(([key, value]) => (
          <li key={key}>{key} - {value}</li>
        ))}
      </ul>
    </>
  );
}

您还可以使用 URLSearchParams.forEach 迭代并捕获 key/value 对。

示例:

const Users = () => {
  const [searchParams, setSearchParams] = useSearchParams();

  const params = [];

  searchParams.forEach((key, value) => {
    params.push([key, value]);
  });

  console.log(params); // [["page", 5], ["pageSize", 25]]

  return (
    <>
      <h1>Params</h1>
      <ul>
        {params.map(([key, value]) => (
          <li key={key}>{key} - {value}</li>
        ))}
      </ul>
    </>
  );
}

使用 .entries for-loop 或 .forEach 方法,您可以改为“减少”为一个对象。

const params = {};

for(let [key, value] of searchParams.entries()) {
  params[key] = value;
}

-- or --

searchParams.forEach((key, value) => {
  params[key] = value;
});

console.log(params); // { page: 5, pageSize: 25 }

...

params.page; // 5
params.pageSize; // 25

综上所述,最好还是使用 .get 方法并显式获取特定的 queryString 参数。