如何从查询字符串中获取参数值?

IT技术 reactjs react-router
2021-03-28 23:34:24

如何在我的 routes.jsx 文件中定义一个路由,以便在__firebase_request_key从 Twitter 的服务器重定向后从 Twitter 的单点登录过程生成的 URL 中捕获参数值?

http://localhost:8000/#/signin?_k=v9ifuf&__firebase_request_key=blablabla

我尝试使用以下路由配置,但:redirectParam没有捕获提到的参数:

<Router>
  <Route path="/" component={Main}>
    <Route path="signin" component={SignIn}>
      <Route path=":redirectParam" component={TwitterSsoButton} />
    </Route>
  </Route>
</Router>
6个回答

React Router v4/v5/v6,通用

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

例如,您可以使用qs库导入qs

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

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

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

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

react-router v3

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

this.props.location.query.__firebase_request_key

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

this.props.match.params.redirectParam

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

一般的

nizam.sp 的建议

console.log(this.props)

在任何情况下都会有所帮助。

不需要为其更改反应路由器。
2021-05-23 23:34:24
@Christian 我最终只使用了普通的 javascript。const path = window.location.pathname; 给我网址。然后我可以按照我需要的方式解析它。我把它放在我的 React 组件的 componentWillMount 生命周期事件中。
2021-05-26 23:34:24
好吧,它只是为了查看内容,一次。您也可以在调试器中放置一个断点并评估 this.props 。如今,即使是 console.log 也能完成这项工作(至少在 Chrome 中你可以扩展这样打印的值)——甚至 console.log 在生产中也没什么用。
2021-06-03 23:34:24
console.dir()由于警告说明,我不建议使用......至少:)
2021-06-05 23:34:24
react-router-dom我不得不使用withRouter来完成这项工作!
2021-06-15 23:34:24

react-router v4

使用 component

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

该组件会使用路由props自动呈现。


使用 render

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

路由props被传递给渲染函数。

query params在使用 React Router v4访问子组件中应用程序的当前 URL 时遇到了类似的问题如果您正在寻找query params,React Router 4 中的 this.props.location.query 已被删除(当前使用 v4.1.1)。看到这个答案: stackoverflow.com/a/43630848/1508105
2021-05-24 23:34:24
不幸的是,这并没有回答这个问题,因为您不一定有,/users/?q=...但您可能有/user?q=...您应该this.props.location.search在 React Router v4 中使用并按照我下面的回答中的解释自己解析结果。
2021-05-24 23:34:24
@NickJ:你使用哪个版本的 React Router?
2021-06-02 23:34:24
@TonySepia 我建议您查找路径参数和查询参数之间的区别。这根本没有回答这个问题。
2021-06-06 23:34:24
这是正确答案。this.props.location.search不存在。
2021-06-16 23:34:24

react-router v3

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

react-router v4

使用 React Router v4,this.props.location.query不再存在。您需要this.props.location.search改用并自己解析查询参数,或者使用现有的包(例如query-string.

例子

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

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 上找到完整的讨论

当您可以使用 URLSearchParams 时,为什么还需要一个库
2021-05-26 23:34:24
它对我来说很有效,因为我很难使用 .split("=") 。
2021-05-30 23:34:24
@SuperUberDuper 因为 Edge 和 iOS Safari - developer.mozilla.org/en-US/docs/Web/API/...
2021-06-04 23:34:24
当然可以,但是只需使用 URLSearchParams polyfill
2021-06-16 23:34:24

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

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

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

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

我们只想得到 123;

第一的

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

然后

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

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

npm i query-string

然后将其导入到当前的 javascript 文件中:

 import queryString from 'query-string'

下一步是在当前 url 中获取“令牌”,执行以下操作:

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

希望能帮助到你。

25/02/2019 更新

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

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

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

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);
}

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

getQueryVariable('aid') //160990
IE 不支持 URLSearchParams(如果这与任何人相关:)
2021-05-25 23:34:24
@Christian 典型的 IE
2021-06-05 23:34:24

React Router v4 不再有 props.location.query 对象(见github讨论)。因此,接受的答案不适用于较新的项目。

v4 的解决方案是使用外部库查询字符串来解析props.location.search

const qs = require('query-string');
//or
import * as qs from 'query-string';

console.log(location.search);
//=> '?foo=bar'

const parsed = qs.parse(location.search);
console.log(parsed);
//=> {foo: 'bar'}
@Chrisvar prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });应该修复它。示例在这里找到:github.com/ljharb/qs
2021-05-30 23:34:24
出于某种原因,我 qs.parse 导致: {'?foo': 'bar'}
2021-06-01 23:34:24
@Chris 或者干脆删除问号: const parsed = qs.parse(location.search.replace('?', ''));
2021-06-09 23:34:24