如何在React-Router V4中获取查询参数


87

我在我的项目中使用react-router-dom 4.0.0-beta.6。我有如下代码:

<Route exact path="/home" component={HomePage}/>

我想在HomePage组件中获取查询参数。我已经找到了location.searchparam,它看起来像这样:?key=value,所以它是未解析的。

用react-router v4获取查询参数的正确方法是什么?

Answers:


181

解析查询字符串的功能已从V4中删除,因为多年来已经提出了支持不同实现的请求。因此,团队决定最好由用户来决定实施的外观。我们建议导入查询字符串lib。这是我用的一个

const queryString = require('query-string');

const parsed = queryString.parse(props.location.search);

您也可以使用new URLSearchParams,如果你想要的东西本土和它适用于您的需求

const params = new URLSearchParams(props.location.search);
const foo = params.get('foo'); // bar

您可以在此处阅读有关该决定的更多信息


12
不要使用没有Polyfill的URLSearchParams。自2018年3月起,Googlebot使用的Chrome 41(developers.google.com/search/docs/guides/rendering)不支持URLSearchParams,如果在关键路径(caniuse.com/#feat=urlsearchparams)中使用,您的应用程序将损坏
约书亚罗宾逊

12

给定的答案是肯定的。

如果要使用qs模块而不是query-string(它们的流行程度大致相等),则语法如下:

const query = qs.parse(props.location.search, {
  ignoreQueryPrefix: true
})

ignoreQueryPrefix选项是忽略领先的问号。


1
真好 在2019年1月,qs每周下载1200万次,而查询字符串为270万次。
oyalhi

6

可接受的答案很好用,但是如果您不想安装其他软件包,则可以使用以下方法:

getUrlParameter = (name) => {
    name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
    let regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
    let results = regex.exec(window.location.search);
    return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
  };

给定 http://www.google.co.in/?key=value

getUrlParameter('key');

将返回 value


谢谢伙伴。“查询字符串”库由于某种原因对我不起作用,但是您的解决方案却很吸引人。我正在使用“ react-dom”:“ ^ 16.0.0”,“ react-router”:“ ^ 4.2.0”,“ react-router-dom”:“ ^ 4.2.2”和“ query-string”: “ ^ 5.0.1”,
Rohan_Paul

这仅假设您的查询字符串中有一个参数。OP明确要求提供查询参数的方法-这就是上述npm模块的作用。将其转换为一个函数,该函数从查询字符串返回键/值对的对象,这将非常有用!
安迪·洛伦兹

@AndyLorenz甚至在您有多个查询参数时也可以使用,使用要获取其值的键调用给定函数。Yes方法也可以转换为键值映射。
kartikag01 '18

那会起作用,但不是一个好的解决方案@Kartik_Agarwal。(a)这将需要多次执行基本相同(可能很昂贵)的代码,(b)每个参数都需要使用单独的变量,而理想情况下,您将填充键/值对的对象,(c)要求您需要知道参数名称,并进行其他检查以查看它们是否存在。如果这是我的代码,我会寻找一个可以迭代获取所有参数的正则表达式,但是我必须承认正则表达式会让我流血!
安迪·洛伦兹


5

我正在研究React Router v4的参数,他们没有将其用于v4,不像React Router v2 / 3。我将保留另一个功能-也许有人会觉得它有用。您只需要es6或纯JavaScript。

function parseQueryParams(query) {
  //You get a '?key=asdfghjkl1234567890&val=123&val2&val3=other'
  const queryArray = query.split('?')[1].split('&');
  let queryParams = {};
  for (let i = 0; i < queryArray.length; i++) {
    const [key, val] = queryArray[i].split('=');
    queryParams[key] = val ? val : true;
  }
  /* queryParams = 
     {
      key:"asdfghjkl1234567890",
      val:"123",
      val2:true,
      val3:"other"
     }
  */
  return queryParams;
}

另外,可以改善此功能


2

queryfie(string){
    return string
        .slice(1)
        .split('&')
        .map(q => q.split('='))
        .reduce((a, c) => { a[c[0]] = c[1]; return a; }, {});
}

queryfie(this.props.location.search);

0

我只是这样做了,因此,如果您从较低版本更新为对路由器v4或更高版本做出反应,则无需更改整个代码结构(在其中使用来自redux路由器存储的查询)。

https://github.com/saltas888/react-router-query-middleware


1
欢迎使用指向解决方案的链接,但是请确保没有该链接的情况下您的回答是有用的:在该链接周围添加上下文,以便您的其他用户可以了解它的含义和含义,然后引用您所使用页面中最相关的部分如果目标页面不可用,请重新链接。只是链接的答案可能会被删除
mrun,

0

很容易

只需使用钩子 useParams()

例:

路由器

<Route path="/user/:id" component={UserComponent} />

在您的组件中

export default function UserComponent() {

  const { id } = useParams();

  return (
    <>{id}</>
  );
}

这不适用于问题中描述的用例(至少不适用于React-Router v4:reactrouter.com/web/api/Hooks/useparams)useParams仅公开路径参数,而不公开搜索参数。
贝尼特

-4

无需任何包装:

const params = JSON.parse(JSON.stringify(this.props.match.params));

然后您可以使用 params.id


3
this.props.match.params包含路径参数,此问题与查询参数有关。
休伯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.