乐闻世界logo
搜索文章和话题

Query string 如何从 query 字符串中获取参数值?

9 个月前提问
5 个月前修改
浏览次数62

8个答案

1
2
3
4
5
6
7
8

在React中,我们可以使用不同的方法来从URL字符串中获取参数值,这通常涉及到处理路由。一个流行的库是React Router。以下是使用React Router v5和v6来从URL中获取参数值的几种方法。

使用 React Router v5

在React Router v5中,你可以通过match对象来访问URL参数。这些参数是通过定义在路由中的path属性捕获的。例子如下:

jsx
import React from 'react'; import { useParams } from 'react-router-dom'; const MyComponent = () => { // 使用 useParams 钩子来获取参数 let { param1 } = useParams(); // 现在你可以使用 param1 作为变量了 return <div>参数值: {param1}</div>; }; export default MyComponent;

在这个例子中,如果你的应用路由定义如下:

jsx
<Route path="/somepath/:param1" component={MyComponent} />

当用户访问/somepath/value1时,param1将会是value1

使用 React Router v6

在React Router v6中,获取参数的方式类似,但是更倾向于使用钩子而不是组件的props。这是一个例子:

jsx
import React from 'react'; import { useParams } from 'react-router-dom'; const MyComponent = () => { // 使用 useParams 钩子来获取参数 const { param1 } = useParams(); // 现在你可以使用 param1 作为变量了 return <div>参数值: {param1}</div>; }; export default MyComponent;

路由定义:

jsx
import { Route, Routes } from 'react-router-dom'; // ... <Routes> <Route path="/somepath/:param1" element={<MyComponent />} /> </Routes>

在这种情况下,useParams 钩子同样被用来获取动态路径参数。

查询参数

如果你需要获取的是查询参数(query parameters),也就是URL中?后面的那部分,则可以使用useLocation钩子来获取整个location对象,其中包括查询字符串:

jsx
import React from 'react'; import { useLocation } from 'react-router-dom'; const useQuery = () => { return new URLSearchParams(useLocation().search); }; const MyComponent = () => { const query = useQuery(); const paramValue = query.get('param1'); // 假设URL是 /somepath?param1=value1 return <div>查询参数值: {paramValue}</div>; }; export default MyComponent;

这里,useQuery是一个自定义钩子,它封装了创建URLSearchParams实例的逻辑,让你可以通过get方法来获取特定的查询参数值。在这个例子中,如果URL是/somepath?param1=value1,那么paramValue变量将会是value1

总的来说,在React中获取URL参数主要通过使用useParams来获取动态路由参数,以及通过useLocationURLSearchParams来获取查询参数。这些是React Router库提供的工具,但它们实际上都是基于原生的Web API(比如window.location)进行封装的。在React中,从URL字符串中获取参数通常涉及到使用React Router库,因为它为路由相关的任务提供了方便的工具和组件。以下是在不同版本的React Router中获取URL参数的方法。

如果您使用的是 React Router v5:

您可以通过useParams钩子或withRouter高阶组件来获取参数值。这里有两个例子:

  1. 使用useParams钩子 (适用于函数组件):

    javascript
    import React from 'react'; import { useParams } from 'react-router-dom'; const MyComponent = () => { let { myParam } = useParams(); console.log(myParam); // 打印出URL参数myParam的值 // 做其他操作... return <div>URL中的参数值: {myParam}</div>; }; export default MyComponent;

    在这个例子中,如果您的路由定义是<Route path="/somepath/:myParam" component={MyComponent} />,那么当您访问/somepath/value时,myParam将会是value

  2. 使用withRouter高阶组件 (适用于类组件):

    javascript
    import React, { Component } from 'react'; import { withRouter } from 'react-router-dom'; class MyComponent extends Component { componentDidMount() { let { myParam } = this.props.match.params; console.log(myParam); // 打印出URL参数myParam的值 } render() { let { myParam } = this.props.match.params; return <div>URL中的参数值: {myParam}</div>; } } export default withRouter(MyComponent);

    withRouter会向您的组件提供matchlocationhistory对象,您可以通过这些对象来访问路由的相关信息。

如果您使用的是 React Router v6:

在React Router v6中,useParams仍然存在,但withRouter已经被移除。以下是使用useParams钩子的方法:

javascript
import React from 'react'; import { useParams } from 'react-router-dom'; const MyComponent = () => { let { myParam } = useParams(); console.log(myParam); // 打印出URL参数myParam的值 // 做其他操作... return <div>URL中的参数值: {myParam}</div>; }; export default MyComponent;

在v6中,路由API做了许多改动,所以您可能也需要使用RoutesRoute来定义路由,而不是v5的SwitchRoute

从URL查询字符串中获取参数:

除了路由参数之外,有时您可能还需要从URL的查询字符串(?key=value部分)中获取参数值。您可以使用useLocation钩子结合URLSearchParams API来实现这一点:

javascript
import React from 'react'; import { useLocation } from 'react-router-dom'; const MyComponent = () => { let location = useLocation(); let queryParams = new URLSearchParams(location.search); let myQueryParam = queryParams.get('key'); // 假设URL是“/myroute?key=value” console.log(myQueryParam); // 打印出查询参数key的值 // 做其他操作... return <div>URL查询字符串中的参数值: {myQueryParam}</div>; }; export default MyComponent;

在这个例子中,如果URL是/myroute?key=value,那么myQueryParam将会是value

这些就是在React中获取URL参数的几种常用方法。如果您需要更多帮助,请告诉我。

2024年6月29日 12:07 回复

React Router v6,使用钩子

在react-router-dom v6中,有一个名为useSearchParams的新钩子。所以与

shell
const [searchParams, setSearchParams] = useSearchParams(); searchParams.get("__firebase_request_key")

你会得到"blablabla"。请注意,searchParams 是 URLSearchParams 的一个实例,它还实现了一个迭代器,例如用于使用 Object.fromEntries 等。

React Router v4/v5,无钩子,通用

React Router v4 不再为您解析查询,但您只能通过this.props.location.search(或 useLocation,见下文)访问它。原因请参见nbeuchat 的回答

例如,您可以导入qsqs

shell
qs.parse(this.props.location.search, { ignoreQueryPrefix: true }).__firebase_request_key

另一个库是query-string。有关解析搜索字符串的更多想法,请参阅此答案。如果您不需要IE 兼容性,也可以使用

shell
new URLSearchParams(this.props.location.search).get("__firebase_request_key")

对于功能组件,您可以this.props.location用钩子useLocation替换。请注意,您可以使用window.location.search,但这不允许在更改时触发 React 渲染。如果您的(非功能性)组件不是 a 的直接子组件,Switch您需要使用withRouter来访问路由器提供的任何道具。

反应路由器 v3

React Router 已经为您解析了位置并将其作为 props传递给您的RouteComponent 。您可以通过以下方式访问查询(网址中?之后)部分

shell
this.props.location.query.__firebase_request_key

如果您正在查找路由器内用冒号 (:) 分隔的路径参数值,可以通过以下方式访问这些值

shell
this.props.match.params.redirectParam

这适用于最新的 React Router v3 版本(不确定是哪个)。据报道,较旧的路由器版本使用this.props.params.redirectParam.

一般的

nizam.sp 的建议

shell
console.log(this.props)

无论如何都会有帮助。

2024年6月29日 12:07 回复

反应路由器 v4

使用component

shell
<Route path="/users/:id" component={UserPage}/> this.props.match.params.id

该组件是使用路线道具自动渲染的。

使用render

shell
<Route path="/users/:id" render={(props) => <UserPage {...props} />}/> this.props.match.params.id

路线道具被传递给渲染函数。

2024年6月29日 12:07 回复

反应路由器 v3

使用 React Router v3,您可以从 (?qs1=naisarg&qs2=parmar) 获取查询字符串this.props.location.search。例如,使用let params = queryString.parse(this.props.location.search), 会给出{ qs1 : 'naisarg', qs2 : 'parmar'}

反应路由器 v4

使用 React Router v4,则this.props.location.query不再存在。您需要**this.props.location.search**自己使用或使用现有的包(例如query-string.

例子

这是使用 React Router v4 和库的最小示例query-string

shell
import { withRouter } from 'react-router-dom'; import queryString from 'query-string'; class ActivateAccount extends Component{ someFunction(){ let params = queryString.parse(this.props.location.search) ... } ... } export default withRouter(ActivateAccount);

合理的

React Router 团队删除该query属性的理由是:

有许多流行的软件包在查询字符串解析/字符串化方面略有不同,并且这些差异中的每一个对于某些用户来说可能是“正确”的方式,而对于其他用户来说可能是“不正确”的方式。如果 React Router 选择了“正确”的一个,那么它只适合某些人。然后,需要添加一种方法供其他用户替换他们首选的查询解析包。React Router 没有内部使用搜索字符串,需要它解析键值对,因此它不需要选择其中哪一个应该是“正确的”。

[...]

4.0 采取的方法是去掉所有“包含电池”的功能,并恢复到基本的路由。如果您需要查询字符串解析或异步加载或 Redux 集成或其他非常具体的东西,那么您可以将其添加到专门针对您的用例的库中。减少您不需要的东西,您可以根据您的特定偏好和需求进行自定义。

您可以在GitHub上找到完整的讨论。

2024年6月29日 12:07 回复

据我所知,可以通过三种方法来做到这一点。

1.使用正则表达式获取查询字符串。

2.您可以使用浏览器api。图片当前的url是这样的:

shell
http://www.google.com.au?token=123

我们只想得到123;

第一的

shell
const query = new URLSearchParams(this.props.location.search);

然后

shell
const token = query.get('token') console.log(token)//123

3. 使用名为“query-string”的第三个库。首先安装它

shell
npm i query-string 然后将其导入到当前的javascript文件中: 从“查询字符串”导入查询字符串

下一步是获取当前 url 中的“token”,执行以下操作:

shell
const value=queryString.parse(this.props.location.search); const token=value.token; console.log('token',token)//123

更新于 25/02/2019

4. 如果当前 url 如下所示:

http://www.google.com.au?app=home&act=article&aid=160990

我们定义一个函数来获取参数:

shell
function getQueryVariable(variable) { var query = window.location.search.substring(1); console.log(query)//"app=article&act=news_content&aid=160990" var vars = query.split("&"); console.log(vars) //[ 'app=article', 'act=news_content', 'aid=160990' ] for (var i=0;i<vars.length;i++) { var pair = vars[i].split("="); console.log(pair)//[ 'app', 'article' ][ 'act', 'news_content' ][ 'aid', '160990' ] if(pair[0] == variable){return pair[1];} } return(false); }

我们可以通过以下方式获得“援助”:

shell
getQueryVariable('aid') //160990
2024年6月29日 12:07 回复

当使用 React hooks 时,无法访问this.props.location. 要捕获 url 参数,请使用windowobject.

shell
const search = window.location.search; const params = new URLSearchParams(search); const foo = params.get('bar');
2024年6月29日 12:07 回复

在React中,我们可以使用不同的方法来从URL字符串中获取参数值,这通常涉及到处理路由。一个流行的库是React Router。以下是使用React Router v5和v6来从URL中获取参数值的几种方法。

使用 React Router v5

在React Router v5中,你可以通过match对象来访问URL参数。这些参数是通过定义在路由中的path属性捕获的。例子如下:

jsx
import React from 'react'; import { useParams } from 'react-router-dom'; const MyComponent = () => { // 使用 useParams 钩子来获取参数 let { param1 } = useParams(); // 现在你可以使用 param1 作为变量了 return <div>参数值: {param1}</div>; }; export default MyComponent;

在这个例子中,如果你的应用路由定义如下:

jsx
<Route path="/somepath/:param1" component={MyComponent} />

当用户访问/somepath/value1时,param1将会是value1

使用 React Router v6

在React Router v6中,获取参数的方式类似,但是更倾向于使用钩子而不是组件的props。这是一个例子:

jsx
import React from 'react'; import { useParams } from 'react-router-dom'; const MyComponent = () => { // 使用 useParams 钩子来获取参数 const { param1 } = useParams(); // 现在你可以使用 param1 作为变量了 return <div>参数值: {param1}</div>; }; export default MyComponent;

路由定义:

jsx
import { Route, Routes } from 'react-router-dom'; // ... <Routes> <Route path="/somepath/:param1" element={<MyComponent />} /> </Routes>

在这种情况下,useParams 钩子同样被用来获取动态路径参数。

查询参数

如果你需要获取的是查询参数(query parameters),也就是URL中?后面的那部分,则可以使用useLocation钩子来获取整个location对象,其中包括查询字符串:

jsx
import React from 'react'; import { useLocation } from 'react-router-dom'; const useQuery = () => { return new URLSearchParams(useLocation().search); }; const MyComponent = () => { const query = useQuery(); const paramValue = query.get('param1'); // 假设URL是 /somepath?param1=value1 return <div>查询参数值: {paramValue}</div>; }; export default MyComponent;

这里,useQuery是一个自定义钩子,它封装了创建URLSearchParams实例的逻辑,让你可以通过get方法来获取特定的查询参数值。在这个例子中,如果URL是/somepath?param1=value1,那么paramValue变量将会是value1

总的来说,在React中获取URL参数主要通过使用useParams来获取动态路由参数,以及通过useLocationURLSearchParams来获取查询参数。这些是React Router库提供的工具,但它们实际上都是基于原生的Web API(比如window.location)进行封装的。

2024年6月29日 12:07 回复

在React中,从URL字符串中获取参数通常涉及到使用React Router库,因为它为路由相关的任务提供了方便的工具和组件。以下是在不同版本的React Router中获取URL参数的方法。

如果您使用的是 React Router v5:

您可以通过useParams钩子或withRouter高阶组件来获取参数值。这里有两个例子:

  1. 使用useParams钩子 (适用于函数组件):

    javascript
    import React from 'react'; import { useParams } from 'react-router-dom'; const MyComponent = () => { let { myParam } = useParams(); console.log(myParam); // 打印出URL参数myParam的值 // 做其他操作... return <div>URL中的参数值: {myParam}</div>; }; export default MyComponent;

    在这个例子中,如果您的路由定义是<Route path="/somepath/:myParam" component={MyComponent} />,那么当您访问/somepath/value时,myParam将会是value

  2. 使用withRouter高阶组件 (适用于类组件):

    javascript
    import React, { Component } from 'react'; import { withRouter } from 'react-router-dom'; class MyComponent extends Component { componentDidMount() { let { myParam } = this.props.match.params; console.log(myParam); // 打印出URL参数myParam的值 } render() { let { myParam } = this.props.match.params; return <div>URL中的参数值: {myParam}</div>; } } export default withRouter(MyComponent);

    withRouter会向您的组件提供matchlocationhistory对象,您可以通过这些对象来访问路由的相关信息。

如果您使用的是 React Router v6:

在React Router v6中,useParams仍然存在,但withRouter已经被移除。以下是使用useParams钩子的方法:

javascript
import React from 'react'; import { useParams } from 'react-router-dom'; const MyComponent = () => { let { myParam } = useParams(); console.log(myParam); // 打印出URL参数myParam的值 // 做其他操作... return <div>URL中的参数值: {myParam}</div>; }; export default MyComponent;

在v6中,路由API做了许多改动,所以您可能也需要使用RoutesRoute来定义路由,而不是v5的SwitchRoute

从URL查询字符串中获取参数:

除了路由参数之外,有时您可能还需要从URL的查询字符串(?key=value部分)中获取参数值。您可以使用useLocation钩子结合URLSearchParams API来实现这一点:

javascript
import React from 'react'; import { useLocation } from 'react-router-dom'; const MyComponent = () => { let location = useLocation(); let queryParams = new URLSearchParams(location.search); let myQueryParam = queryParams.get('key'); // 假设URL是“/myroute?key=value” console.log(myQueryParam); // 打印出查询参数key的值 // 做其他操作... return <div>URL查询字符串中的参数值: {myQueryParam}</div>; }; export default MyComponent;

在这个例子中,如果URL是/myroute?key=value,那么myQueryParam将会是value

这些就是在React中获取URL参数的几种常用方法。如果您需要更多帮助,请告诉我。

2024年6月29日 12:07 回复

你的答案