Comment définir un itinéraire dans mon fichier routes.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 à partir de leurs serveurs?
http://localhost:8000/#/signin?_k=v9ifuf&__firebase_request_key=blablabla
J'ai essayé avec la configuration d'itinéraires suivante, mais le :redirectParam
n'intercepte pas le paramètre mentionné:
<Router>
<Route path="/" component={Main}>
<Route path="signin" component={SignIn}>
<Route path=":redirectParam" component={TwitterSsoButton} />
</Route>
</Route>
</Router>
React Router v3
React Router analyse déjà l’emplacement pour vous et le transmet à votre RouteComponent comme accessoire. Vous pouvez accéder à la partie requête (après? Dans l'URL) via
this.props.location.query.__firebase_request_key
Si vous recherchez les valeurs du paramètre path, séparées par deux points (:) dans le routeur, elles sont accessibles via
this.props.match.params.redirectParam
Ceci s’applique aux versions tardives de React Router v3 (vous ne savez pas quoi). Les anciennes versions de routeur utilisaient this.props.params.redirectParam
.
React Router v4
React Router v4 n'analyse plus la requête pour vous, mais vous ne pouvez y accéder que via this.props.location.search
. Pour les raisons voir la réponse de nbeuchat .
Par exemple. avec query-string library importé en tant que qs
vous pourriez le faire
qs.parse(this.props.location.search, { ignoreQueryPrefix: true }).__firebase_request_key
De plus, si votre composant n'est pas un enfant direct d'une Switch
, vous devez utiliser withRouter pour accéder à l'un des accessoires fournis par le routeur.
Général
suggestion de nizam.sp
console.log(this.props)
sera utile dans tous les cas.
Utilisation de component
<Route path="/users/:id" component={UserPage}/>
this.props.match.params.id
Le composant est automatiquement rendu avec les accessoires de route.
Utilisation de render
<Route path="/users/:id" render={(props) => <UserPage {...props} />}/>
this.props.match.params.id
Les accessoires de route sont transmis à la fonction de rendu.
React Router v4
Avec React Router v4, le this.props.location.query
n'existe plus. Vous devez utiliser this.props.location.search
à la place et analyser les paramètres de la requête par vous-même ou à l'aide d'un package existant tel que query-string
.
Exemple
Voici un exemple minimal d'utilisation de React Router v4 et de 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);
Rationnel
L’équipe du React Router pour supprimer la propriété query
est la suivante:
Il existe un certain nombre de packages populaires qui effectuent une analyse légèrement différente de la syntaxe de la chaîne. Chacune de ces différences peut correspondre à la méthode "correcte" pour certains utilisateurs et "incorrecte" pour d'autres. Si React Router choisissait le "bon", il ne conviendrait que pour certaines personnes. Ensuite, il faudrait ajouter un moyen permettant aux autres utilisateurs de se substituer à leur package d'analyse syntaxique préféré. React Router n'utilise en interne aucune chaîne de recherche qui l'oblige à analyser les paires clé-valeur. Il n'est donc pas nécessaire de choisir laquelle d'entre elles doit être "correcte".
[...]
L’approche adoptée pour la version 4.0 consiste à supprimer toutes les fonctionnalités du type "piles incluses" et à revenir à un routage de base. Si vous avez besoin d'analyser les chaînes de requête, de charger de manière asynchrone ou d'intégrer Redux ou quelque chose de très spécifique, vous pouvez l'ajouter à une bibliothèque spécialement pour votre cas d'utilisation. Moins de choses cruelles sont emballées dans ce dont vous n’avez pas besoin et vous pouvez personnaliser les choses selon vos préférences et vos besoins.
Vous pouvez trouver la discussion complète sur GitHub .
React Router v4 n'a plus leprops.location.query
object (voir github discussion). La réponse acceptée ne fonctionnera donc pas pour les nouveaux projets.
Une solution pour la 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'}
vous pouvez vérifier le react-router , en toute simplicité, 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
React Router v4
const urlParams = new URLSearchParams(this.props.location.search)
const key = urlParams.get('__firebase_request_key')
S'il vous plaît noter qu'il est actuellement expérimental.
Vérifiez la compatibilité du navigateur ici: https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/URLSearchParams#Browser_compatibility
Si votre routeur est comme ça
<Route exact path="/category/:id" component={ProductList}/>
Vous obtiendrez cet identifiant comme ça
this.props.match.params.id
Autant que je sache, trois méthodes sont possibles.
1. Utilisez une expression régulière pour obtenir une chaîne de requête.
2.vous pouvez utiliser le navigateur api . Image l'url actuelle est la suivante:
http://www.google.com.au?token=123
nous voulons juste avoir 123;
Premier
const query = new URLSearchParams(this.props.location.search);
Ensuite
const token = query.get('token')
console.log(token)//123
3. utilisez une troisième bibliothèque appelée 'query-string' . Installez-la d'abord.
npm i query-string
Puis importez-le dans le fichier javascript actuel:
import queryString from 'query-string'
La prochaine étape consiste à obtenir un "jeton" dans l'URL actuelle, procédez comme suit:
const value=queryString.parse(this.props.location.search);
const token=value.token;
console.log('token',token)//123
J'espère que ça aide.
Mis à jour le 25/02/2019
http://www.google.com.au?app=home&act=article&aid=160990
nous définissons une fonction pour obtenir les paramètres:
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);
}
Nous pouvons obtenir de l'aide en:
getQueryVariable('aid') //160990
React router
à partir de la v4 ne vous donne plus le query params
directement dans son objet location
. La raison étant
Il existe un certain nombre de paquets populaires qui interrogent string analyser/stringing légèrement différemment, et chacun de ceux-ci les différences peuvent être "correctes" pour certains utilisateurs et "incorrectes" pour les autres. Si React Router choisissait le "bon", il ne s'agirait que de bon pour certaines personnes. Ensuite, il faudrait ajouter un moyen pour l'autre les utilisateurs à substituer dans leur paquet d'analyse syntaxique préféré. Il y a aucune utilisation interne de la chaîne de recherche par React Router qui le nécessite pour analyser les paires clé-valeur, de sorte qu'il n'a pas besoin de choisir lequel l'un d'entre eux devrait être "correct".
Cela inclus, il serait plus logique d’analyser simplement location.search dans votre vue les composants qui attendent un objet de requête.
Vous pouvez le faire de manière générique en remplaçant la withRouter
à partir 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)
J'ai eu du mal à résoudre ce problème. Si rien de ce qui précède ne fonctionne, vous pouvez essayer ceci à la place. J'utilise l'application create-react-app
Exigences
react-router-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 voudriez transmettre comme ceci
<Route path="some/path/:id" .../>
Sur la page où vous effectuez le rendu de/path, vous pouvez spécifier ceci pour afficher le nom du paramètre id d'appel comme ceci
componentDidMount(){
console.log(this.props);
console.log(this.props.match.params.id);
}
À la fin de l'exportation par défaut
export default withRouter(Component);
N'oubliez pas d'inclure l'importation
import { withRouter } from 'react-router-dom'
Lorsque console.log (this.props) vous pourrez savoir ce qui a été transmis. S'amuser!
Si vous n'obtenez pas le this.props
... que vous attendiez d'après les 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))
this.props.params.your_param_name
fonctionnera.
C'est le moyen d'obtenir les paramètres de votre chaîne de requête.
S'il vous plaît faites console.log(this.props);
pour explorer toutes les possibilités.
Peut-être un peu tard, mais ce crochet de réaction peut vous aider à obtenir/définir des valeurs dans une requête URL: https://github.com/rudyhuynh/use-url-search-params (écrit par moi).
Cela fonctionne avec ou sans react-router
. Vous trouverez ci-dessous un exemple de code dans votre cas:
import React from "react";
import { useUrlSearchParams } from "use-url-search-params";
const MyComponent = () => {
const [params, setParams] = useUrlSearchParams()
return (
<div>
__firebase_request_key: {params.__firebase_request_key}
</div>
)
}
Dans le composant où vous devez accéder aux paramètres, vous pouvez utiliser
this.props.location.state.from.search
qui révélera la chaîne de requête complète (tout ce qui suit le signe ?
)
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
})
}
In React Router v4 uniquement avec Route est la bonne manière
Vous pouvez accéder aux propriétés de l’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 restitution.
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)
J'ai utilisé un paquet externe appelé query-string pour analyser les paramètres d'URL comme suit.
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}));
}
let data = new FormData();
data.append('file', values.file);
Vous pouvez voir la requête en utilisant:
console.log(this.props.location.query)