react-router:如何从URL获取参数值
如何在我的routes.jsx文件中定义一个路由,以便在从其服务器redirect之后,通过Twitter单点login过程生成的URL中捕获__firebase_request_key
参数值?
http://localhost:8000/#/signin?_k=v9ifuf&__firebase_request_key=blablabla
我试着用下面的路由configuration,但是:redirectParam
没有捕获提到的参数:
<Router> <Route path="/" component={Main}> <Route path="signin" component={SignIn}> <Route path=":redirectParam" component={TwitterSsoButton} /> </Route> </Route> </Router>
React路由器已经parsing了你的位置,并把它作为道具传给你的RouteComponent 。 您可以通过访问查询(&后)部分
this.props.location.query.__firebase_request_key
如果您正在查找path参数值,在路由器中用冒号(:)分隔,则可以通过这些参数值访问这些值
this.props.match.params.redirectParam
(旧的路由器版本被报告使用this.props.params.redirectParam)
nizam.sp的build议
console.log(this.props)
在任何情况下都会有所帮助。
你可以检查react-router ,简单来说,只要你在你的路由器中定义就可以使用代码来获取查询参数:
this.props.params.userId
反应路由器v4
使用component
<Route path="/users/:id" component={UserPage}/>
this.props.match.params.id
该组件会自动使用path道具进行渲染。
使用render
<Route path="/users/:id" render={(props) => <UserPage {...props} />}/>
this.props.match.params.id
path道具被传递给渲染function。
this.props.params.your_param_name
将工作。
这是从查询string中获取参数的方法。
请做console.log(this.props);
探索所有的可能性。
React Router v4不再具有 props.location.query
对象 (请参阅github讨论)。 所以接受的答案不适用于较新的项目。
v4的解决scheme是使用外部库查询string来parsingprops.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'}
在需要访问可以使用的参数的组件中
this.props.location.state.from.search
这将揭示整个查询string(在?
符号之后的所有内容)
如果你没有得到this.props
…你期望基于其他答案,你可能需要使用withRouter
( docs v4 ):
import React from 'react' import PropTypes from 'prop-types' import { withRouter } from 'react-router' // A simple component that shows the pathname of the current location class ShowTheLocation extends React.Component { static propTypes = { match: PropTypes.object.isRequired, location: PropTypes.object.isRequired, history: PropTypes.object.isRequired } render() { const { match, location, history } = this.props return ( <div>You are now at {location.pathname}</div> ) } } // Create a new component that is "connected" (to borrow redux terminology) to the router. const TwitterSsoButton = withRouter(ShowTheLocation) // This gets around shouldComponentUpdate withRouter(connect(...)(MyComponent)) // This does not connect(...)(withRouter(MyComponent))