Как получить значение параметра из строки запроса
как я могу определить маршрут в моих маршрутах.jsx файл для захвата __firebase_request_key значение параметра из URL-адреса, созданного процессом единого входа Twitter после перенаправления с их серверов?
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>
17 ответов:
React Router v3
React маршрутизатор уже анализирует местоположение для вас и передает его на ваш RouteComponent в качестве реквизита. Вы можете получить доступ к запросу (после ? в url) часть через
this.props.location.query.__firebase_request_keyесли вы ищете значения параметров пути, разделенные двоеточием (:) внутри маршрутизатора, они доступны через
this.props.match.params.redirectParamэто относится к поздним версиям React Router v3 (не уверен, какие). Более старые версии маршрутизатора были сообщает использовать
this.props.params.redirectParam.реагировать маршрутизатор v4
React Router v4 больше не анализирует запрос для вас, но вы можете получить к нему доступ только через
this.props.location.search. По причинам см. ответ nbeuchat.Е. Г. с запрос-строку библиотека импортируется как
qsвы могли бы сделатьqs.parse(this.props.location.search, { ignoreQueryPrefix: true }).__firebase_request_keyкроме того, если ваш компонент не является прямым потомком элемента
Switchвы должны использовать withRouter to доступ к любому из предоставленных маршрутизатором реквизитов.общие
низам.предложение sp сделать
console.log(this.props)будет полезно в любом случае.
реагировать маршрутизатор v4
используя
component<Route path="/users/:id" component={UserPage}/>this.props.match.params.idкомпонент автоматически отображается с реквизитами маршрута.
используя
render<Route path="/users/:id" render={(props) => <UserPage {...props} />}/>this.props.match.params.idреквизиты маршрута передаются в функцию рендеринга.
React маршрутизатор v4 больше не имеет
props.location.queryобъект (см. github обсуждения). Так что принятый ответ не будет работать для новых проектов.решение для v4 заключается в использовании внешней библиотеки запрос-строку для разбора
props.location.searchconst 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'}
реагировать маршрутизатор v4
с маршрутизатором React 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);рациональный
Реагировать Команда маршрутизатора rational для удаления
queryсвойства:Существует несколько популярных пакетов, которые делать синтаксический анализ строки запроса/слегка построения строкового представления по-разному, и каждое из этих различий может быть "правильного" и "неправильного" для других. Если бы React Router выбрал "правильный", это было бы правильно только для некоторых людей. Затем необходимо будет добавить способ для других пользователей, чтобы заменить их в предпочтительном пакете синтаксического анализа запросов. Нет внутреннее использование строки поиска маршрутизатором React, который требует от него разбора пар ключ-значение, поэтому ему не нужно выбирать, какой из них должен быть "правильным".
[...]
подход, используемый для 4.0, заключается в том, чтобы удалить все "включенные батареи" и вернуться к простой маршрутизации. Если вам нужен синтаксический анализ строки запроса или асинхронная загрузка или интеграция Redux или что-то еще очень конкретное, вы можете добавить это в библиотеку конкретно для вашего случая. Меньше хлама упакован в том, что вам не нужно и вы можете настроить для ваших конкретных потребностей и предпочтений.
вы можете найти полное обсуждение GitHub.
вы можете проверить react-router, проще говоря, вы можете использовать код для получения параметра запроса до тех пор, как вы определили в маршрутизаторе:
this.props.params.userId
Если ваш маршрутизатор такой
<Route exact path="/category/:id" component={ProductList}/>вы получите этот идентификатор, как это
this.props.match.params.id
реагировать маршрутизатор v4
const urlParams = new URLSearchParams(this.props.location.search) const key = urlParams.get('__firebase_request_key')обратите внимание, что в настоящее время является экспериментальной.
проверьте совместимость браузера здесь: https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/URLSearchParams#Browser_compatibility
this.props.params.your_param_nameбудет работать.Это способ получить параметры из строки запроса.
Пожалуйста, сделайтеconsole.log(this.props);чтобы изучить все возможности.
Если вы не получаете
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))
React routerначиная с v4 больше не дает вамquery paramsнепосредственно вlocation"объект". Причина в томСуществует несколько популярных пакетов, которые делают строку запроса парсинг/слегка построения строкового представления по-разному, и каждый из этих различия могут быть "правильным" способом для некоторых пользователей и " неправильным" для других. Если бы React Router выбрал "правильный", это было бы только правильно для некоторых людей. Затем, это должно было бы добавить способ для других пользователям замените в их предпочтительном пакете синтаксического анализа запросов. Есть нет внутреннего использования строки поиска маршрутизатором React, который этого требует чтобы проанализировать пары ключ-значение, поэтому ему не нужно выбирать, какие один из них должен быть "правильным".
включив это, было бы просто более разумно просто разобрать местоположение.поиск в компонентах представления, которые ожидают объект запроса.
вы можете сделать это в общем случае, переопределив
withRouterСreact-routerкакcustomWithRouter.js
import { compose, withPropsOnChange } from 'recompose'; import { withRouter } from 'react-router'; import queryString from 'query-string'; const propsWithQuery = withPropsOnChange( ['location', 'match'], ({ location, match }) => { return { location: { ...location, query: queryString.parse(location.search) }, match }; } ); export default compose(withRouter, propsWithQuery)
в компоненте, где вам нужно получить доступ к параметрам, которые вы можете использовать
this.props.location.state.from.searchкоторый покажет всю строку запроса (все после
?знак)
в React Router v4 только withRoute является правильным способом
вы можете получить доступ к свойствам объекта истории и ближайшему совпадению через компонент withrouter более высокого порядка. withRouter будет передавать обновленные совпадения, местоположение и историю реквизитов для обернутого компонента всякий раз, когда он отображает.
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 ShowTheLocationWithRouter = withRouter(ShowTheLocation)
мне было трудно решить эту проблему. Если ни один из вышеперечисленных работ, вы можете попробовать это. Я использую create-react-app
требования
react-router-dom": "^4.3.1"
решение
в месте, где указан маршрутизатор
<Route path="some/path" ..../>добавьте имя параметра, которое вы хотели бы передать, как это
<Route path="some/path/:id" .../>на странице, где вы делаете некоторые / путь вы можете укажите это, чтобы просмотреть идентификатор вызова имени параметра следующим образом
componentDidMount(){ console.log(this.props); console.log(this.props.match.params.id); }в конце, где вы экспортируете по умолчанию
export default withRouter(Component);не забудьте включить импорт
import { withRouter } from 'react-router-dom'для консоли.журнал(это.реквизит) вы могли бы то, что было передано вниз. Получайте удовольствие!
я использовал внешний пакет под названием query-string для разбора параметра url, например.
import React, {Component} from 'react' import { parse } from 'query-string'; resetPass() { const {password} = this.state; this.setState({fetching: true, error: undefined}); const query = parse(location.search); return fetch(settings.urls.update_password, { method: 'POST', headers: {'Content-Type': 'application/json', 'Authorization': query.token}, mode: 'cors', body: JSON.stringify({password}) }) .then(response=>response.json()) .then(json=>{ if (json.error) throw Error(json.error.message || 'Unknown fetch error'); this.setState({fetching: false, error: undefined, changePassword: true}); }) .catch(error=>this.setState({fetching: false, error: error.message})); }
componentDidMount(){ //http://localhost:3000/service/anas //<Route path="/service/:serviceName" component={Service} /> const {params} =this.props.match; this.setState({ title: params.serviceName , content: data.Content })}
самое простое решение!
в маршрутизации :
<Route path="/app/someUrl/:id" exact component={binder} />в коде реакции:
componentDidMount() { var id = window.location.href.split('/')[window.location.href.split('/').length - 1]; var queryString = "http://url/api/controller/" + id $.getJSON(queryString) .then(res => { this.setState({ data: res }); }); }
Comments