298 votes

React-Router Lien externe

Comme j'utilise React Router pour gérer mes routes dans une application React, je suis curieux de savoir s'il existe un moyen de rediriger vers une ressource externe.

Disons que quelqu'un accède à :

example.com/privacy-policy

Je voudrais le rediriger vers :

example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies

Je ne trouve absolument aucune aide pour éviter de l'écrire en JavaScript brut lors du chargement de mon index.html avec quelque chose comme :

if (window.location.path === "privacy-policy"){
  window.location = "example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies"
}

1 votes

Quel React Router utilisez-vous?

1 votes

Je suis en train d'utiliser la version 3.x

2 votes

Il suffit de changer window.location.href pour effectuer une redirection formelle.

306voto

Voici une seule ligne pour utiliser React Router pour rediriger vers un lien externe:

 {
    window.location.href = 'https://example.com/1234';
    return null;
}}/>

Il utilise le concept de composant pur de React pour réduire le code du composant à une seule fonction qui, au lieu de rendre quoi que ce soit, redirige le navigateur vers une URL externe.

Cela fonctionne à la fois sur React Router 3 et 4.

4 votes

Cela fonctionne mais je cherchais une solution plus élégante et évolutive. Voyez ce à quoi j'ai pensé car cela m'a permis d'aller encore plus loin avec les redirections pour les applications mobiles, etc. (pas ReactNative, applications vraiment natives). Maintenant, ce que je fais n'est pas la bonne façon de résoudre mon problème, mais pour régler ce problème, je vous suggère d'étudier également ma solution ne serait-ce que pour une perspective différente.

2 votes

Ce n'est pas vraiment propre dans mon esprit. Je préférerais utiliser honnêtement une balise d'ancre. De plus, en cliquant sur le bouton de retour du navigateur, vous renvoie à la route qui redirige ensuite vers example.zendesk.com/hc/en-us/articles/…

28 votes

Pour un meilleur comportement du bouton de retour (vérifiez pour votre application), utilisez window.location.replace('example.com')

144voto

Diego Laciar Points 414

Il n'est pas nécessaire d'utiliser le composant de React Router.

Si vous voulez aller vers un lien externe, utilisez une balise d'ancre.

Politiques

Utilisez les attributs de lien rel="noopener" ou rel="noreferrer" pour chaque lien. L'attribut de lien rel="noreferrer" fonctionne également de la même manière que l'attribut de lien "noopener" en ce qu'il empêche le site lié de prendre le contrôle du site de liaison.

51 votes

Le OP demandait comment le faire de manière programmative, et non déclarative

47 votes

Réponse non pertinente et trompeuse.

21 votes

Si vous utilisez ceci, ajoutez rel="noopener noreferrer" à

89voto

Alan Points 417

Il n'est pas nécessaire de demander React Router. Cette action peut être réalisée de manière native et est fournie par le navigateur.

Il suffit d'utiliser window.location.

Avec React Hooks

const RedirectPage = () => {
  React.useEffect(() => {
    window.location.replace('https://www.google.com')
  }, [])
}

Avec React Class Component

class RedirectPage extends React.Component {
  componentDidMount(){
    window.location.replace('https://www.google.com')
  }
}

Aussi, si vous voulez l'ouvrir dans un nouvel onglet :

window.open('https://www.google.com', '_blank');

3 votes

Cette réponse est incomplète, ne permet pas l'abstraction ou sa relation avec le routeur

27 votes

Voici le but. Il n'est pas nécessaire de demander à react router. Cette action peut être effectuée de manière native et elle est fournie par le navigateur.

1 votes

Et si nous voulons également transmettre l'URL de manière dynamique ainsi que le code de statut HTTP lors de la redirection vers un site externe. J'ai trouvé un exemple, mais ce n'est pas clair avec mes besoins. gist.github.com/arasmussen/f2c01dc858481590f6bffae6b540632c

52voto

Relic Points 1236

En fait, j'ai fini par construire mon propre composant, . Il récupère des informations de l'élément react-router, donc je peux le garder dans mes itinéraires. Comme ceci:

Voici mon composant au cas où quelqu'un serait curieux:

import React, { Component } from "react";

export class Redirect extends Component {
  constructor( props ){
    super();
    this.state = { ...props };
  }
  componentWillMount(){
    window.location = this.state.route.loc;
  }
  render(){
    return (Redirection en cours...);
  }
}

export default Redirect;

Remarque: Ceci est avec react-router: 3.0.5, ce n'est pas aussi simple en 4.x

0 votes

Vous n'êtes pas obligé de faire quoi que ce soit, React est un framework, et il y a beaucoup de valeur dans un framework. C'est ainsi qu'il faut le faire dans le cadre de React. Cependant, cela ne prend pas en compte le module d'historique du navigateur qui pourrait être inclus ici, ce qui le rendrait encore plus utile. Veuillez également noter que "window.location" est la façon dont cela était fait en 1999. Ceci est juste une manière de l'ajouter à votre tableau de routes pour le routage côté client. Ce n'est pas une "bonne" solution.

0 votes

Dans react-router v4, vous pouvez utiliser render à la place de component

4 votes

@Irrech "rendre à la place du composant" ne veut rien dire. Si vous avez une réponse à la question, veuillez l'ajouter et donner quelques détails sur la façon dont vous la mettriez en œuvre.

1voto

ytibrewala Points 126

Je ne pense pas que React Router offre ce support. La documentation mentionne

Un < Redirect > configure une redirection vers une autre route dans votre application pour conserver les anciennes URL.

Vous pourriez essayer d'utiliser quelque chose comme React-Redirect à la place.

0 votes

React-Redirect est obsolète

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