Lire l'URL complète actuelle avec React?

138

Comment obtenir l'URL complète à partir d'un composant ReactJS?

Je pense que ça devrait être quelque chose comme this.props.locationmais ça l'estundefined

Doug
la source

Réponses:

221

window.location.href est ce que vous recherchez.

probablement
la source
16
Veuillez noter qu'il peut avoir des problèmes côté serveur s'il n'est pas configuré correctement.
Shota
2
J'avais besoin de window.location pour une fonctionnalité côté client. J'ai donc défini l'emplacement dans l'état de mon composant onMount afin d'éviter les problèmes lors du rendu côté serveur.
Arvind Sridharan
ça ne marche pas. ou veuillez m'aider avec la structure de cela en réaction. J'ai utilisé const ddd = window.location.href; console.log (ddd);
Shurvir Mori
1
webpack se plaindra de cette disant « fenêtre est pas définie »
Franz Voir
@FranzSee oui, il n'y a pas de "fenêtre" dans le code côté serveur, donc si c'est votre environnement, vous devrez utiliser quelque chose comme req.originalUrlfrom express ou autre. Les diverses bibliothèques de routage de réaction prenant en charge SSR ont des méthodes pour obtenir ces informations.
probablementup
60

Si vous avez besoin du chemin complet de votre URL, vous pouvez utiliser du Javascript vanille:

window.location.href

Pour obtenir uniquement le chemin (moins le nom de domaine), vous pouvez utiliser:

window.location.pathname

console.log(window.location.pathname); //yields: "/js" (where snippets run)
console.log(window.location.href);     //yields: "https://stacksnippets.net/js"

Source: Propriété du chemin de l'emplacement - W3Schools

Si vous n'utilisez pas déjà "react-router", vous pouvez l'installer en utilisant:

yarn add react-router

puis dans un React.Component dans une "Route", vous pouvez appeler:

this.props.location.pathname

Cela renvoie le chemin, sans inclure le nom de domaine.

Merci @ abdulla-zulqarnain!

Lewdev
la source
2
vous pouvez faire comme ça pour le chemin d'accèswindow.location.pathname
Abdulla Zulqarnain
13

Vous obtenez undefinedparce que vous avez probablement les composants en dehors de React Router.

N'oubliez pas que vous devez vous assurer que le composant à partir duquel vous appelez se this.props.locationtrouve à l'intérieur d'un <Route />composant tel que celui-ci:

<Route path="/dashboard" component={Dashboard} />

Ensuite, dans le composant Dashboard, vous avez accès à this.props.location...

James
la source
3
Et si votre composant n'est pas à l'intérieur d'un, <Route />vous pouvez utiliser un composant d'ordre supérieur withRouter .
Ahmad Maleki
3

Pour obtenir l' instance de routeur actuelle ou l'emplacement actuel, vous devez créer un composant d'ordre supérieur avec withRouter from react-router-dom. sinon, lorsque vous essayez d'y accéder, this.props.locationil retournera undefined

Exemple

import React, { Component } from 'react';
import { withRouter } from 'react-router-dom';

class className extends Component {

      render(){
           return(
                ....
                  )
              }
}

export default withRouter(className)
Alex Varghese
la source
2

Juste pour ajouter un peu plus de documentation à cette page - je me débat avec ce problème depuis un certain temps.

Comme indiqué ci-dessus, le moyen le plus simple d'obtenir l'URL est via window.location.href.

nous pouvons ensuite extraire des parties de l'URL via Javascript vanilla en utilisant let urlElements = window.location.href.split('/')

On verrait alors console.log(urlElements)le tableau d'éléments produit en appelant .split () sur l'URL.

Une fois que vous avez trouvé l'index du tableau auquel vous souhaitez accéder, vous pouvez ensuite l'affecter à une variable

let urlElelement = (urlElements[0])

Et maintenant, vous pouvez utiliser la valeur de urlElement, qui sera la partie spécifique de votre URL, où vous le souhaitez.

à240
la source
0

Comme quelqu'un d'autre l'a mentionné, vous avez d'abord besoin d'un react-routerpackage. Mais l' locationobjet qu'il vous fournit contient une URL analysée.

Mais si vous voulez mal une URL complète sans accéder aux variables globales, je pense que le moyen le plus rapide de le faire serait

...

const getA = memoize(() => document.createElement('a'));
const getCleanA = () => Object.assign(getA(), { href: '' });

const MyComponent = ({ location }) => {
  const { href } = Object.assign(getCleanA(), location);

  ...

href est celui contenant une URL complète.

Pour memoizej'utilise habituellement lodash, il est implémenté de cette façon principalement pour éviter de créer un nouvel élément sans nécessité.

PS: Bien sûr, si vous n'êtes pas limité par les anciens navigateurs, vous voudrez peut-être essayer new URL()quelque chose, mais fondamentalement, toute la situation est plus ou moins inutile, car vous accédez à la variable globale d'une manière ou d'une autre. Alors pourquoi ne pas l'utiliser à la window.location.hrefplace?

Yurii Haiovyi
la source
-3

Vous pouvez accéder à l'URI / url complet avec 'document.referrer'

Vérifiez https://developer.mozilla.org/en-US/docs/Web/API/Document/referrer

Amit Lopes
la source
Le référent est l'URL de la page sur laquelle vous vous trouviez avant d'atteindre cette page. Il ne peut pas non plus être défini. Bien qu'il puisse être utile de suivre les mouvements des utilisateurs, c'est rarement ce que vous voulez lorsque vous recherchez l'URL.
Alexis Wilke