从 react-router 哈希片段获取查询参数

Getting query parameters from react-router hash fragment

提问人:Christopher Robin 提问时间:4/25/2015 更新时间:8/1/2022 访问量:219529

问:

我在客户端将 react 和 react-router 用于我的应用程序。我似乎无法弄清楚如何从以下网址获取以下查询参数:

http://xmen.database/search#/?status=APPROVED&page=1&limit=20

我的路线看起来像这样(我知道这条路是完全错误的):

var routes = (
<Route>
    <DefaultRoute handler={SearchDisplay}/>
    <Route name="search" path="?status=:status&page=:page&limit=:limit" handler={SearchDisplay}/>
    <Route name="xmen" path="candidate/:accountId" handler={XmenDisplay}/>
</Route>
);

我的路由工作正常,但我不确定如何格式化路径以获取我想要的参数。感谢任何帮助!

JavaScript ReactJS React-Router 客户端脚本

评论

0赞 Cory Danielson 4/25/2015
我环顾四周,只能找到在组件中提取查询字符串参数的示例,通过getCurrentQuery
0赞 Cory Danielson 4/25/2015
github.com/rackt/react-router/issues/209
0赞 Cory Danielson 4/25/2015
您可以在处理程序上使用钩子。它接收查询字符串参数。github.com/rackt/react-router/commit/......willTransitionTo
0赞 Cory Danielson 4/25/2015
这里还有关于过渡钩子的文档:github.com/rackt/react-router/blob/master/docs/api/components/...一旦你弄清楚了,你应该用你的解决方案来回答这个问题。我相信你不会是最后一个遇到这种情况的人。

答:

161赞 Duncan Finney 4/26/2015 #1

注意:从评论中复制/粘贴。一定要喜欢原帖!

用 es6 编写并使用 react 0.14.6 / react-router 2.0.0-rc5。我使用此命令在我的组件中查找查询参数:

this.props.location.query

它在 url 中创建所有可用查询参数的哈希值。

更新:

对于 React-Router v4,请参阅此答案。基本上,用于获取查询字符串并使用包或 URLSearchParams 进行解析:this.props.location.searchquery-string

const params = new URLSearchParams(paramsString); 
const tags = params.get('tags');

评论

2赞 Peter Aron Zentai 1/10/2016
从 React-router 1.x 开始,它就不再是 2.x ////
7赞 btown 2/16/2016
根据 Peter 的说法,这个例子已经过时了:见 stackoverflow.com/a/35005474/298073
2赞 mc9 4/13/2017
query似乎在 React Router 4 中消失了。github.com/ReactTraining/react-router/issues/......
59赞 Marrs 1/26/2016 #2

OLD(v4 之前):

用 es6 编写并使用 react 0.14.6 / react-router 2.0.0-rc5。我使用此命令在我的组件中查找查询参数:

this.props.location.query

它在 url 中创建所有可用查询参数的哈希值。

更新(React Router v4+):

React Router 4 中的 this.props.location.query 已被删除(当前使用 v4.1.1) 有关该问题的更多信息,请参阅:https://github.com/ReactTraining/react-router/issues/4410

看起来他们希望你使用自己的方法来解析查询参数,目前使用这个库来填补空白:https://github.com/sindresorhus/query-string

评论

2赞 Thomas Modeneis 5/26/2016
我已经使用 React 0.14.8 进行了测试,您的答案不起作用渲染:错误::|TypeError: Cannot read property 'location' of undefined
3赞 Marrs 6/1/2016
嘿@ThomasModeneis,这是您的路由器正在渲染的最顶层的父组件吗?还是子组件?如果我没记错的话,您必须将 this.props.location.query 从路由器渲染的父组件传递到您的子组件中,这是我唯一能想到的事情。
4赞 Adam McCormick 4/15/2016 #3

在阅读了其他答案(首先是 @duncan-finney 之后,然后是 @Marrs),我开始寻找更改日志,解释惯用的 react-router 2.x 方法来解决这个问题。关于在组件中使用位置(查询需要)的文档实际上与实际代码相矛盾。因此,如果你听从他们的建议,你会得到这样的愤怒警告:

Warning: [react-router] `context.location` is deprecated, please use a route component's `props.location` instead.

事实证明,您不能有一个名为 location 的上下文属性来使用位置类型。但是,您可以使用名为 loc 的上下文属性,该属性使用位置类型。因此,解决方案是对其源代码进行小幅修改,如下所示:

const RouteComponent = React.createClass({
    childContextTypes: {
        loc: PropTypes.location
    },

    getChildContext() {
        return { location: this.props.location }
    }
});

const ChildComponent = React.createClass({
    contextTypes: {
        loc: PropTypes.location
    },
    render() {
        console.log(this.context.loc);
        return(<div>this.context.loc.query</div>);
    }
});

您也可以只将您想要的位置对象的部分传递给您的孩子,从而获得相同的好处。它没有更改警告以更改为对象类型。希望能有所帮助。

17赞 Lin Du 6/23/2016 #4

更新 2017.12.25

"react-router-dom": "^4.2.2"

网址喜欢

BrowserHistory:http://localhost:3000/demo-7/detail/2?sort=name

HashHistory:http://localhost:3000/demo-7/#/detail/2?sort=name

使用查询字符串依赖项:

this.id = props.match.params.id;
this.searchObj = queryString.parse(props.location.search);
this.from = props.location.state.from;

console.log(this.id, this.searchObj, this.from);

结果:

2 {sort: "name"} home


"react-router": "^2.4.1"

Url likehttp://localhost:8080/react-router01/1?name=novaline&age=26

const queryParams = this.props.location.query;

queryParams 是一个包含查询参数的对象:{name: novaline, age: 26}

评论

0赞 codeVerine 7/23/2018
如果你有这样的东西:(即没有之后)那么对于 react router v4,你应该使用http://localhost:8090/#access_token=PGqsashgJdrZoU6hV8mWAzwlXkJZO8ImDcn&expires_in=7200&token_type=bearer/#location.hashlocation.search
62赞 hashcode55 4/26/2017 #5

上述答案在 中不起作用。这是我为解决问题所做的工作 -react-router v4

第一安装解析所需的查询字符串

npm install -save query-string

现在,在路由组件中,您可以像这样访问未解析的查询字符串

this.props.location.search

您可以通过登录控制台进行交叉检查。

最后,解析以访问查询参数

const queryString = require('query-string');
var parsed = queryString.parse(this.props.location.search);
console.log(parsed.param); // replace param with your own 

所以如果查询是这样的?hello=world

console.log(parsed.hello)将记录world

评论

20赞 ninhjs.dev 9/6/2017
或者没有 lib:(较旧的浏览器需要 polyfill)。const query = new URLSearchParams(props.location.search); console.log(query.get('hello'));
0赞 2/28/2020
当我构建应用程序时,这应该有效,对吧?
10赞 accimeesterlin 2/26/2018 #6

使用 stringquery 包:

import qs from "stringquery";

const obj = qs("?status=APPROVED&page=1limit=20");  
// > { limit: "10", page:"1", status:"APPROVED" }

使用 query-string 包:

import qs from "query-string";
const obj = qs.parse(this.props.location.search);
console.log(obj.param); // { limit: "10", page:"1", status:"APPROVED" } 

无包装:

const convertToObject = (url) => {
  const arr = url.slice(1).split(/&|=/); // remove the "?", "&" and "="
  let params = {};

  for(let i = 0; i < arr.length; i += 2){
    const key = arr[i], value = arr[i + 1];
    params[key] = value ; // build the object = { limit: "10", page:"1", status:"APPROVED" }
  }
  return params;
};


const uri = this.props.location.search; // "?status=APPROVED&page=1&limit=20"

const obj = convertToObject(uri);

console.log(obj); // { limit: "10", page:"1", status:"APPROVED" }


// obj.status
// obj.page
// obj.limit

希望能:)

祝您编码愉快!

0赞 Balasubramani M 6/13/2018 #7

使用 query-string 模块时,在创建优化的生产版本时,可能会收到以下错误。

无法缩小此文件中的代码: ./node_modules/query-string/index.js:8

为了克服这个问题,请使用名为 stringquery 的替代模块,该模块在运行构建时可以很好地执行相同的过程,而不会出现任何问题。

import querySearch from "stringquery";

var query = querySearch(this.props.location.search);
3赞 Vijesh Chandera 7/16/2018 #8

简单的js解决方案:

queryStringParse = function(string) {
    let parsed = {}
    if(string != '') {
        string = string.substring(string.indexOf('?')+1)
        let p1 = string.split('&')
        p1.map(function(value) {
            let params = value.split('=')
            parsed[params[0]] = params[1]
        });
    }
    return parsed
}

您可以使用以下命令从任何地方调用它:

var params = this.queryStringParse(this.props.location.search);

希望这会有所帮助。

15赞 Meisam Nazari 8/30/2019 #9
"react-router-dom": "^5.0.0",

您不需要添加任何其他模块,只需在具有如下 URL 地址的组件中添加:

http://localhost:3000/#/?authority'

您可以尝试以下简单代码:

    const search =this.props.location.search;
    const params = new URLSearchParams(search);
    const authority = params.get('authority'); //
2赞 Samira 7/24/2022 #10
"react-router-dom": "6"

我可以通过以下方式获取页面属性的值useSearchParams

let [searchParams, setSearchParams] = useSearchParams();

searchParams.get('page')

当你有一个 URL 时,比如你可以得到页面。完整的例子在这里:http://asd.com/report/7?page=3

 import React from 'react';
 import { useSearchParams} from "react-router-dom";
    
    const Detail = (props) => {
        const [searchParams, setSearchParams] = useSearchParams();
        console.log('page from search',searchParams.get('page')) // 1
        return (
            <div></div>
        );
    };
    
    export default Detail;

反应路由器