如何在 react-router v4 中获取查询参数
How to get query parameters in react-router v4
我在我的项目中使用 react-router-dom 4.0.0-beta.6。
我有如下代码:
<Route exact path="/home" component={HomePage}/>
我想在 HomePage
组件中获取查询参数。
我找到了 location.search
参数,它看起来像这样:?key=value
,所以它是未解析的。
使用 react-router v4 获取查询参数的正确方法是什么?
解析查询字符串的能力已从 V4 中删除,因为多年来一直要求支持不同的实现。有了这个,团队决定最好由用户来决定该实现的样子。我们建议导入查询字符串库。 Here's one that I use
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
您可以阅读有关该决定的更多信息here
接受的答案很好,但如果您不想安装额外的包,您可以使用这个:
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');
将returnvalue
我正在研究 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;
}
另外,这个功能还可以改进
我刚刚做了这个,所以如果你更新以从较低版本响应路由器 v4 或更高版本,则不需要更改整个代码结构(你使用来自 redux 路由器商店的查询)。
给出的答案是可靠的。
如果您想使用 qs module instead of query-string(它们的受欢迎程度大致相同),语法如下:
const query = qs.parse(props.location.search, {
ignoreQueryPrefix: true
})
ignoreQueryPrefix
选项是忽略开头的问号。
不需要任何包:
const params = JSON.parse(JSON.stringify(this.props.match.params));
然后就可以通过params.id
找到相关的参数了
嗯?
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);
另一种有用的方法可能是像这样使用开箱即用的 URLSearchParams
;
let { search } = useLocation();
const query = new URLSearchParams(search);
const paramField = query.get('field');
const paramValue = query.get('value');
干净、可读且不需要模块。更多信息如下;
很容易
只需使用钩子useParams()
示例:
路由器:
<Route path="/user/:id" component={UserComponent} />
在你的组件中t:
export default function UserComponent() {
const { id } = useParams();
return (
<>{id}</>
);
}
这是一种无需导入任何额外库的方法
const queryString = (string) => {
return string.slice(1).split('&')
.map((queryParam) => {
let data = queryParam.split('=')
return { key: data[0], value: data[1] }
})
.reduce((query, data) => {
query[data.key] = data.value
return query
}, {});
}
const paramData = (history && history.location && history.location.search)
? parseQueryString(history.location.search)
: null;
根据他们的文档https://reactrouter.com/web/example/query-parameters你需要:
import { useLocation } from 'react-router-dom';
// A custom hook that builds on useLocation to parse
// the query string for you.
function useQuery() {
return new URLSearchParams(useLocation().search);
}
function App() {
const query = useQuery();
console.log(query.get('queryYouAreLookingFor'));
}
React Router v6
来源:Getting Query Strings (Search Params) in React Router
我知道这是 v4 的问题,但是随着 v6 的发布,下面是我们如何在新版本的 React Router 中搜索参数。
使用新的 useSearchParams
挂钩和 .get()
方法:
const Users = () => {
const [searchParams] = useSearchParams();
console.log(searchParams.get('sort')); // 'name'
return <div>Users</div>;
};
通过这种方法,您可以读取一个或几个参数。
阅读更多内容并进行现场演示:Getting Query Strings (Search Params) in React Router
如果你的路由定义是这样的:
<Route exact path="/edit/:id" ...../>
import { useParams } from "react-router";
const { id } = useParams();
console.log(id)
我在我的项目中使用 react-router-dom 4.0.0-beta.6。 我有如下代码:
<Route exact path="/home" component={HomePage}/>
我想在 HomePage
组件中获取查询参数。
我找到了 location.search
参数,它看起来像这样:?key=value
,所以它是未解析的。
使用 react-router v4 获取查询参数的正确方法是什么?
解析查询字符串的能力已从 V4 中删除,因为多年来一直要求支持不同的实现。有了这个,团队决定最好由用户来决定该实现的样子。我们建议导入查询字符串库。 Here's one that I use
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
您可以阅读有关该决定的更多信息here
接受的答案很好,但如果您不想安装额外的包,您可以使用这个:
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');
将returnvalue
我正在研究 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;
}
另外,这个功能还可以改进
我刚刚做了这个,所以如果你更新以从较低版本响应路由器 v4 或更高版本,则不需要更改整个代码结构(你使用来自 redux 路由器商店的查询)。
给出的答案是可靠的。
如果您想使用 qs module instead of query-string(它们的受欢迎程度大致相同),语法如下:
const query = qs.parse(props.location.search, {
ignoreQueryPrefix: true
})
ignoreQueryPrefix
选项是忽略开头的问号。
不需要任何包:
const params = JSON.parse(JSON.stringify(this.props.match.params));
然后就可以通过params.id
嗯?
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);
另一种有用的方法可能是像这样使用开箱即用的 URLSearchParams
;
let { search } = useLocation();
const query = new URLSearchParams(search);
const paramField = query.get('field');
const paramValue = query.get('value');
干净、可读且不需要模块。更多信息如下;
很容易
只需使用钩子useParams()
示例:
路由器:
<Route path="/user/:id" component={UserComponent} />
在你的组件中t:
export default function UserComponent() {
const { id } = useParams();
return (
<>{id}</>
);
}
这是一种无需导入任何额外库的方法
const queryString = (string) => {
return string.slice(1).split('&')
.map((queryParam) => {
let data = queryParam.split('=')
return { key: data[0], value: data[1] }
})
.reduce((query, data) => {
query[data.key] = data.value
return query
}, {});
}
const paramData = (history && history.location && history.location.search)
? parseQueryString(history.location.search)
: null;
根据他们的文档https://reactrouter.com/web/example/query-parameters你需要:
import { useLocation } from 'react-router-dom';
// A custom hook that builds on useLocation to parse
// the query string for you.
function useQuery() {
return new URLSearchParams(useLocation().search);
}
function App() {
const query = useQuery();
console.log(query.get('queryYouAreLookingFor'));
}
React Router v6
来源:Getting Query Strings (Search Params) in React Router
我知道这是 v4 的问题,但是随着 v6 的发布,下面是我们如何在新版本的 React Router 中搜索参数。
使用新的 useSearchParams
挂钩和 .get()
方法:
const Users = () => {
const [searchParams] = useSearchParams();
console.log(searchParams.get('sort')); // 'name'
return <div>Users</div>;
};
通过这种方法,您可以读取一个或几个参数。
阅读更多内容并进行现场演示:Getting Query Strings (Search Params) in React Router
如果你的路由定义是这样的:
<Route exact path="/edit/:id" ...../>
import { useParams } from "react-router";
const { id } = useParams();
console.log(id)