#reactjs
#reactjs
Вопрос:
Как мне получить полный URL-адрес из компонента ReactJS?
Я думаю, это должно быть что-то вроде this.props.location
, но это undefined
Ответ №1:
window.location.href
это то, что вы ищете.
Комментарии:
1. Пожалуйста, обратите внимание, что при неправильной настройке могут возникнуть проблемы на стороне сервера.
2. Мне нужно было окно. расположение функции на стороне клиента. Поэтому я установил местоположение в состоянии моего компонента onMount, чтобы избежать проблем при рендеринге на стороне сервера.
3. это не работает. или, пожалуйста, помогите мне со структурой этого в react. Я использовал const ddd = window . location.href; console.log(ddd);
4. webpack будет жаловаться на это, говоря: «окно не определено»
5. @FranzSee да, в коде на стороне сервера нет «окна», поэтому, если это ваша среда, вам нужно будет использовать что-то вроде
req.originalUrl
from express или что-то еще. Различные библиотеки маршрутизации react, поддерживающие SSR, имеют методы для получения этой информации.
Ответ №2:
Если вам нужен полный путь к вашему URL-адресу, вы можете использовать ванильный Javascript:
window.location.href
Чтобы получить только путь (минус доменное имя), вы можете использовать:
window.location.pathname
console.log(window.location.pathname); //yields: "/js" (where snippets run)
console.log(window.location.href); //yields: "https://stacksnippets.net/js"
Источник: Свойство Location pathname — W3Schools
Если вы еще не используете «react-router», вы можете установить его с помощью:
yarn add react-router
затем в React.Компонент внутри «Маршрута», вы можете вызвать:
this.props.location.pathname
Это возвращает путь, не включая имя домена.
Спасибо @abdulla-zulqarnain!
Комментарии:
1. вы можете сделать то же самое для pathname
window.location.pathname
Ответ №3:
window.location.href
это то, что вам нужно. Но также, если вы используете react router, вам может быть полезно проверить перехваты useLocation и useHistory. Оба создают объект с атрибутом pathname, который вы можете прочитать, и полезны для множества других вещей. Вот видео на YouTube, объясняющее перехваты маршрутизатора react
Оба дадут вам то, что вам нужно (без имени домена):
import { useHistory ,useLocation } from 'react-router-dom';
const location = useLocation()
location.pathname
const history = useHistory()
history.location.pathname
Комментарии:
1. В вопросе уже говорилось «с помощью React», по-видимому
window.location.href
, это не способ реагирования.
Ответ №4:
this.props.location
это функция react-router, которую вам нужно установить, если вы хотите ее использовать.
Примечание: не возвращает полный URL-адрес.
Комментарии:
1. Примечание: это не возвращает полный URL-адрес (имя хоста, протокол и т.д.)
Ответ №5:
Вы получаете undefined
, потому что у вас, вероятно, есть компоненты вне маршрутизатора React.
Помните, что вам нужно убедиться, что компонент, из которого вы вызываете this.props.location
, находится внутри такого <Route />
компонента, как этот:
<Route path="/dashboard" component={Dashboard} />
Затем внутри компонента Dashboard у вас есть доступ к this.props.location
…
Комментарии:
1. И если ваш компонент не находится внутри
<Route />
, вы можете использовать компонент более высокого порядка withRouter.
Ответ №6:
Простой JS :
window.location.href // Returns full path, with domain name
window.location.origin // returns window domain url Ex : "https://stackoverflow.com"
window.location.pathname // returns relative path, without domain name
Использование react-router
this.props.location.pathname // returns relative path, without domain name
С помощью react Hook
const location = useLocation(); // React Hook
console.log(location.pathname); // returns relative path, without domain name
Комментарии:
1. Здесь запрашивается URL-адрес, а не только путь. URL также включает строку запроса и хэш.
2. о useLocation на самом деле это довольно опасный совет — useLocation запустит рендеринг, если местоположение будет изменено см. Документы reactrouter.com/en/main/hooks/use-location
Ответ №7:
Просто чтобы добавить немного дополнительной документации на эту страницу — я некоторое время боролся с этой проблемой.
Как было сказано выше, самый простой способ получить URL-адрес — через window.location.href
.
затем мы можем извлечь части URL-адреса с помощью ванильного Javascript, используя let urlElements = window.location.href.split('/')
Затем мы console.log(urlElements)
бы увидели массив элементов, созданных вызовом .split() по URL-адресу.
После того, как вы нашли, к какому индексу в массиве вы хотите получить доступ, вы можете присвоить его переменной
let urlElelement = (urlElements[0])
И теперь вы можете использовать значение urlElement , которое будет определенной частью вашего URL, где бы вы ни захотели.
Ответ №8:
Чтобы получить текущий экземпляр маршрутизатора или текущее местоположение, вы должны создать компонент более высокого порядка с withRouter
помощью from react-router-dom
. в противном случае, когда вы пытаетесь получить к нему доступ this.props.location
, он вернет undefined
Пример
import React, { Component } from 'react';
import { withRouter } from 'react-router-dom';
class className extends Component {
render(){
return(
....
)
}
}
export default withRouter(className)
Ответ №9:
Прочитав это, я нашел решение React / NextJs
. Потому что, если мы используем непосредственно используемый window.location.href
в react или nextjs, он выдает ошибку, например
Ошибка сервера ReferenceError: окно не определено
import React, { useState, useEffect } from "react";
const Product = ({ product }) => {
const [pageURL, setPageURL] = useState(0);
useEffect(() => {
setPageURL(window.location.href);
})
return (
<div>
<h3>{pageURL}</h3>
</div>
);
};
https://medium.com/frontend-digest/why-is-window-not-defined-in-nextjs-44daf7b4604e#:~:text=NextJS is a framework that,is not run in%
Примечание 20NodeJS:.
Ответ №10:
Как уже упоминал кто-то другой, сначала вам нужен react-router
пакет. Но location
объект, который он вам предоставляет, содержит проанализированный URL.
Но если вам нужен полный URL-адрес без доступа к глобальным переменным, я считаю, что самым быстрым способом сделать это было бы
...
const getA = memoize(() => document.createElement('a'));
const getCleanA = () => Object.assign(getA(), { href: '' });
const MyComponent = ({ location }) => {
const { href } = Object.assign(getCleanA(), location);
...
href
содержит ли он полный URL-адрес.
Для memoize
меня обычно lodash
это реализовано таким образом, в основном, чтобы избежать создания нового элемента без необходимости.
PS: Конечно, если вы не ограничены древними браузерами, вы можете попробовать new URL()
, но в основном вся ситуация более или менее бессмысленна, потому что вы получаете доступ к глобальной переменной тем или иным способом. Так почему бы не использовать window.location.href
вместо этого?