395 votes

Comment passer des paramètres avec history.push/Link/Redirect dans react-router v4 ?

Comment passer un paramètre avec this.props.history.push('/page') dans React-Router v4 ?

.then(response => {
       var r = this;
        if (response.status >= 200 && response.status < 300) {
             r.props.history.push('/template');
          });

0 votes

Le composant qui est rendu par un Route devrait avoir accès à this.props.location , this.props.history etc. Je pense que vous n'avez pas besoin d'utiliser ref plus avec la v4. Essayez de faire this.props.history.push('/template');

0 votes

Ce n'est pas un ref ,c'est une variable qui pointe vers ceci ; this.props.history.push('/template') ; me conduit à la page suivante mais je veux passer les props avec eux .ref = this ;

0 votes

Vous essayez de passer props au composant qui correspond à la route ? Je pense ce fil de discussion GitHub répond à votre préoccupation.

562voto

Shubham Khatri Points 67350

Tout d'abord, vous n'avez pas besoin de faire var r = this; comme ceci dans if statement fait référence au contexte de la fonction de rappel elle-même qui, puisque vous utilisez la fonction flèche, fait référence au contexte du composant React.

Selon les documents :

Les objets historiques possèdent généralement les propriétés et méthodes suivantes :

  • length - (nombre) Le nombre d'entrées dans la pile de l'historique.
  • action - (string) L'action en cours (PUSH, REPLACE, ou POP)
  • location - (objet) L'emplacement actuel. Peut avoir les propriétés suivantes :

    • pathname - (string) Le chemin de l'URL
    • search - (string) La chaîne de requête de l'URL
    • hash - (string) Le fragment de hachage de l'URL
    • state - (chaîne) état spécifique à l'emplacement qui a été fourni à e.g. push(path, state) lorsque cet emplacement a été poussé sur la pile. pile. Disponible uniquement dans le navigateur et l'historique de la mémoire.
  • push(path, [state]) - (fonction) Pousse une nouvelle entrée sur la pile de l'historique.
  • replace(path, [state]) - (fonction) Remplace l'entrée courante sur la pile de l'historique.
  • go(n) - (fonction) Déplace le pointeur dans la pile d'historique de n entrées
  • goBack() - (fonction) Équivalent de go(-1)
  • goForward() - (fonction) Équivalent de go(1)
  • block(prompt) - (fonction) Empêche la navigation

Ainsi, tout en naviguant, vous pouvez passer des props à l'objet historique comme suit

this.props.history.push({
  pathname: '/template',
  search: '?query=abc',
  state: { detail: response.data }
})

ou de la même manière pour le Link ou le Redirect composant

<Link to={{
      pathname: '/template',
      search: '?query=abc',
      state: { detail: response.data }
    }}> My Link </Link>

et ensuite dans le composant qui est rendu avec /template vous pouvez accéder aux props passés de la manière suivante

this.props.location.state.detail

Gardez également à l'esprit que, lorsque vous utilisez des objets d'historique ou de localisation à partir de props, vous devez connecter le composant avec withRouter .

Selon les Docs :

avecRouter

Vous pouvez accéder aux propriétés de l'objet historique et à la plus proche <Route>'s par le biais de la withRouter composante d'ordre supérieur. withRouter rendra à nouveau son composant à chaque fois que la route changera avec les mêmes props que <Route> Rendu props: { match, location, history } .

3 votes

Oui, ça a marché. Merci ! Mais je ne sais pas pourquoi this.props.history.push('/template',response.data) ne fonctionne pas. Selon les docs de push(path, [state]) tu ne crois pas que ça devrait marcher ?

1 votes

Merci pour cela ! Dans mon cas, je ne passais que l'historique directement, donc j'ai accédé à ma prop via this.props.history.location.state.propName -.

1 votes

@SanketPatel vous devez faire ceci this.props.history.push('/template', {response : response.data})

51voto

Tenusha Points 474

Que vous pouvez utiliser,

this.props.history.push("/template", { ...response }) ou this.props.history.push("/template", { response: response })

alors vous pouvez accéder aux données analysées à partir de /template par le code suivant,

const state = this.props.location.state

En savoir plus sur React Gestion de l'historique des sessions

0 votes

Cette logique a fonctionné pour moi avec history.push avec back_url dans l'état this.props.history.push(redirect_url,{ back_url : '/needing_url' }) ; et j'ai obtenu ceci à la page de destination par this.props.location.state.back_url

14voto

shyke Points 49

Si vous devez passer des paramètres d'URL

Il y a un grand post d'explication par Tyler McGinnis sur son site, Lien vers l'article

Voici des exemples de code :

  1. sur le composant history.push :

    this.props.history.push(`/home:${this.state.userID}`)

  2. sur le composant du routeur où vous définissez la route :

    <Route path='/home:myKey' component={Home} />

  3. sur le composant Accueil :

    componentDidMount(){ const { myKey } = this.props.match.params console.log(myKey ) }

0 votes

J'ai quelque chose comme ça, mais si je rafraîchis la page, elle se bloque complètement.

0 votes

@rabiaasif parce que les données ne sont plus là, vous devez les faire persister ou les stocker dans une mémoire locale.

3voto

joedotnot Points 996

Il n'est pas nécessaire d'utiliser withRouter. Ceci fonctionne pour moi :

Dans votre page parent,

<BrowserRouter>
   <Switch>
        <Route path="/routeA" render={(props)=> (
          <ComponentA {...props} propDummy={50} />
        )} />

        <Route path="/routeB" render={(props)=> (
          <ComponentB {...props} propWhatever={100} />
          )} /> 
      </Switch>
</BrowserRouter>

Ensuite, dans le ComposantA ou le ComposantB, vous pouvez accéder à

this.props.history

y compris la méthode this.props.history.push.

0 votes

Je pense que tu n'avais pas besoin withRouter parce que vous avez enveloppé votre composant avec BrowserRouter qui fonctionne de la même manière.

0 votes

Oui et vous passez le props de chaque composant, qui comprend le history prop.

-10voto

kamal pandey Points 73

Ajouter des informations pour obtenir les paramètres de la requête.

const queryParams = new URLSearchParams(this.props.location.search);
console.log('assuming query param is id', queryParams.get('id');

Pour plus d'informations sur URLSearchParams, consultez ce lien. URLSearchParams

1 votes

Ceci n'est pas du tout pertinent pour React Router 4.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X