Comment obtenir la valeur du paramètre de chaîne de requête

Comment puis-je définir un itinéraire dans mes itinéraires.fichier jsx pour capturer la valeur du paramètre __firebase_request_key à partir d'une URL générée par le processus de connexion unique de Twitter après la redirection de leurs serveurs?

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

J'ai essayé avec la configuration de routes suivante, mais le :redirectParam n'attrape pas le paramètre mentionné:

<Router>
  <Route path="/" component={Main}>
    <Route path="signin" component={SignIn}>
      <Route path=":redirectParam" component={TwitterSsoButton} />
    </Route>
  </Route>
</Router>
181
demandé sur Uwe Keim 2016-02-12 03:19:13

17 réponses

Réagir Routeur v3

Réagir Routeur traite l'endroit pour vous et le transmet à votre RouteComponent, comme les accessoires. Vous pouvez accéder à la requête (après ? dans la partie url) via

this.props.location.query.__firebase_request_key

Si vous recherchez les valeurs du paramètre path, séparées par deux-points (:) à l'intérieur du routeur, celles-ci sont accessibles via

this.props.match.params.redirectParam

Ceci s'applique aux versions tardives de React Router V3 (pas sûr). Les anciennes versions de routeur ont été signalées à utiliser this.props.params.redirectParam.

Réagir Routeur v4

Réagir Routeur v4 de ne pas analyser la requête pour vous, mais vous ne pouvez y accéder via this.props.location.search. Pour des raisons, voir la réponse de nbeuchat .

Par exemple avec query-string bibliothèque importée comme qs Vous pouvez faire

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

En Outre, si votre composant n'est pas un enfant direct d'un Switch, vous devez utiliser withRouter pour accéder au routeur fourni accessoires de jeu.

Général

Nizam.ps propose de le faire

console.log(this.props)

Sera utile dans tous les cas.

250
répondu Christian 2018-09-03 08:10:51

Réagir Routeur v4

À l'Aide de component

<Route path="/users/:id" component={UserPage}/> 

this.props.match.params.id

Le composant est automatiquement rendu avec les accessoires de route.


À l'Aide de render

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

this.props.match.params.id

Les accessoires de Route sont passés à la fonction de rendu.

86
répondu spencer.sm 2017-10-11 15:47:28

Réagir Routeur v4 n'a plus le props.location.query objet (voir github discussion). Donc, la réponse acceptée ne fonctionnera pas pour les nouveaux projets.

Une solution pour v4 consiste à utiliser une bibliothèque externe query-string pour analyser le 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'}
50
répondu JTG 2017-11-03 16:47:43

Réagir Routeur v4

Avec React Router v4, le this.props.location.query n'existe plus. Vous devez utiliser this.props.location.search au lieu de cela et analysez les paramètres de requête soit par vous même ou en utilisant un package existant tel que query-string.

Exemple

Voici un exemple minimal utilisant React Router v4 et la bibliothèque 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);

Rationnelle

La rationale de L'équipe du routeur React pour supprimer la propriété query est la suivante:

Il existe un certain nombre de paquets populaires qui font une analyse/stringification de chaîne de requête légèrement différemment, et chacune de ces différences peut être la manière "correcte" pour certains utilisateurs et "incorrecte" pour d'autres. Si Réagissent Routeur choisi le "bon", il ne serait bon pour certaines personnes. Ensuite, il faudrait ajouter un moyen pour les autres utilisateurs de remplacer dans leur package d'analyse de requête préféré. Il n'y a pas d'utilisation interne de la chaîne de recherche par React Router qui l'oblige à analyser la clé-valeur paires, donc il n'a pas besoin de choisir lequel d'entre eux devrait être "bon".

[...]

L'approche adoptée pour 4.0 consiste à supprimer toutes les fonctionnalités "batteries incluses" et à revenir au routage de base. Si vous avez besoin d'une analyse de chaîne de requête ou d'un chargement asynchrone ou d'une intégration Redux ou d'autre chose de très spécifique, vous pouvez l'ajouter avec une bibliothèque spécifiquement pour votre cas d'utilisation. Moins cruft est emballé dans ce que vous n'avez pas besoin et vous pouvez personnaliser les choses à vos préférences et besoins.

Vous pouvez trouver la discussion complète sur GitHub .

46
répondu nbeuchat 2018-01-15 03:57:54

Vous pouvez vérifier le react-router , en simple, vous pouvez utiliser le code pour obtenir le paramètre de requête tant que vous avez défini dans votre routeur:

this.props.params.userId
21
répondu TommyLike 2016-06-21 02:18:45

Si votre Routeur est comme ceci

<Route exact path="/category/:id" component={ProductList}/>

Vous obtiendrez cet identifiant comme ceci

this.props.match.params.id
11
répondu Milan Panigrahi 2017-12-20 09:40:13

Réagir Routeur v4

const urlParams = new URLSearchParams(this.props.location.search)
const key = urlParams.get('__firebase_request_key')

Veuillez noter qu'il est actuellement expérimentale.

Vérifiez la compatibilité du navigateur ici: https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/URLSearchParams#Browser_compatibility

9
répondu Mike Frenil L 2018-03-06 16:07:20

this.props.params.your_param_name ça marchera.

C'est la façon d'obtenir les paramètres de votre chaîne de requête.
Veuillez faire console.log(this.props); pour explorer toutes les possibilités.

5
répondu nizam.sp 2016-02-15 07:30:34

Si vous n'obtenez pas le this.props... vous vous attendiez sur la base des autres réponses, vous devrez peut-être utiliser 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))
5
répondu jtlindsey 2017-09-08 01:20:18

React router à partir de v4, vous ne pouvez plus accéder directement au query params dans son objet location. La raison étant

Il existe un certain nombre de paquets populaires qui font une chaîne de requête parsing / stringifying légèrement différemment, et chacun d'entre eux les différences peuvent être la manière "correcte" pour certains utilisateurs et " incorrecte" pour les autres. Si React Router a choisi le "bon", ce ne serait que droit pour certaines personnes. Ensuite, il faudrait ajouter un moyen pour d'autres utilisateurs à remplacer dans leur paquet d'analyse de requête préféré. Il est aucune utilisation interne de la chaîne de recherche par React Router qui l'exige pour analyser les paires clé-valeur, il n'est donc pas nécessaire de choisir l'un d'eux doit être "de droite".

Après avoir inclus cela, il serait juste plus logique d'analyser simplement l'emplacement.recherchez dans vos composants de vue qui attendent un objet de requête.

Vous pouvez le faire génériquement en remplaçant le withRouter de react-router comme

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)
3
répondu Shubham Khatri 2018-04-25 06:28:00

Dans le composant où vous devez accéder aux paramètres, vous pouvez utiliser

this.props.location.state.from.search

Qui révélera toute la chaîne de requête (Tout après le signe ?)

2
répondu Rocco Ghielmini 2017-03-28 21:19:47

Dans React Router v4 seulement withRoute est correcte façon

Vous pouvez accéder aux propriétés de l'objet historique et à la correspondance la plus proche via le composant d'ordre supérieur withRouter. withRouter transmettra les accessoires de correspondance, d'emplacement et d'historique mis à jour au composant encapsulé chaque fois qu'il sera rendu.

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)

Https://reacttraining.com/react-router/web/api/withRouter

1
répondu krystianj 2018-03-07 21:38:59

J'ai eu du mal à résoudre ce problème. Si aucun des travaux ci-dessus, vous pouvez essayer cela à la place. J'utilise l'application create-react

Exigences

Réagir-routeur-dom": "^4.3.1"

Solution

À l'emplacement où le routeur est spécifié

<Route path="some/path" ..../>

Ajoutez le nom du paramètre que vous souhaitez transmettre comme ceci

<Route path="some/path/:id" .../>

Sur la page où vous affichez/path, vous pouvez spécifier ceci pour afficher le nom du paramètre call id comme ce

componentDidMount(){
  console.log(this.props);
  console.log(this.props.match.params.id);
}

À la fin où vous exportez par défaut

export default withRouter(Component);

N'oubliez pas d'inclure l'importation

import { withRouter } from 'react-router-dom'

Lorsque la console.journal(ce.props) vous seriez capable de ce qui a été transmis. Amuse-toi bien!

1
répondu NarDd 2018-09-28 07:15:13

J'ai utilisé un paquet externe appelé query-string pour analyser le paramètre url comme ceci.

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}));
}
0
répondu Joe 2018-03-14 22:38:21

, Vous pouvez voir la requête en utilisant:

console.log(this.props.location.query)
0
répondu smartworld-konoha 2018-06-22 17:48:25
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
    })

}

0
répondu Anas Alpure 2018-08-03 06:31:10

Solution la plus simple!

Dans le routage:

   <Route path="/app/someUrl/:id" exact component={binder} />

Dans le code react:

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 });
      });
  }
-2
répondu A.J 2018-05-27 06:34:26