使用React阅读当前的完整URL?


136

如何从ReactJS组件中获取完整的URL?

我想它应该是这样的this.props.location,但它是undefined

Answers:


218

window.location.href 是您要寻找的。


16
请注意,如果配置不正确,它可能在服务器端出现问题。
Shota

2
我需要window.location作为客户端的功能。所以我将位置设置为组件onMount的状态,以避免在服务器端进行渲染时出现问题。
Arvind Sridharan的

它不起作用。或帮助我做出反应的结构。我用了 const ddd = window.location.href; console.log(ddd);
Shurvir Mori

1
webpack会抱怨这句话“窗口未定义”
Franz请参阅

@FranzSee是,服务器端代码中没有“窗口”,因此,如果您的环境是您,则需要使用req.originalUrlexpress或诸如此类的东西。具有SSR支持的各种反应路由库都有获取此信息的方法。
可能

60

如果您需要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"

源:位置路径名属性-W3Schools

如果您尚未使用“反应路由器”,则可以使用以下方法进行安装:

yarn add react-router

然后在“路线”中的React.Component中,可以调用:

this.props.location.pathname

这将返回路径,不包括域名。

谢谢@ abdulla-zulqarnain!


2
您可以像使用路径名一样操作window.location.pathname
Abdulla Zulqarnain


13

你越来越 undefined之所以会这么做,因为您可能在React Router之外拥有组件。

请记住,您需要确保要调用this.props.location<Route />组件位于这样的组件内部:

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

然后在Dashboard组件内,您可以访问this.props.location...


3
并且如果您的组件不在内部<Route />,则可以使用withRouter高阶组件。
艾哈迈德·马勒基

3

要获取当前路由器实例当前位置,您必须使用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)

1

只是为了在此页面上添加更多文档-我已经为这个问题苦苦挣扎了一段时间。

如上所述,获取网址的最简单方法是通过 window.location.href

然后,我们可以使用原始Javascript提取URL的一部分 let urlElements = window.location.href.split('/')

然后我们会 console.log(urlElements),看到通过在URL上调用.split()产生的元素数组。

找到要访问的数组中的索引后,可以将其分配给变量

let urlElelement = (urlElements[0])

现在,您可以随时随地使用urlElement的值,该值将是URL的特定部分。


0

正如其他人提到的,首先您需要react-router包装。但是location它提供给您的对象包含已解析的url。

但是,如果您很想在不访问全局变量的情况下非常想要完整的网址,那么我认为最快的方法是

...

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

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

  ...

href 是包含完整网址的网址。

对于memoize我通常使用lodash,它的实现主要是为了避免不必要地创建新元素。

PS:当然,您不受尝试使用new URL()旧浏览器的限制,但是基本上整个情况几乎没有意义,因为您以一种或另一种方式访问​​全局变量。那么为什么不使用它window.location.href呢?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.