Reactで現在の完全なURLを読みますか?


134

ReactJSコンポーネント内から完全なURLを取得するにはどうすればよいですか?

私はそれが次のようなものであるべきだと思っていますthis.props.locationが、それはundefined

回答:


218

window.location.href あなたが探しているものです。


16
正しく設定されていない場合、サーバー側で問題が発生する可能性があることに注意してください。
ショタ

2
クライアント側の機能にwindow.locationが必要でした。そこで、サーバー側でのレンダリング中に問題が発生しないように、コンポーネントの状態をonMountに設定しました。
Arvind Sridharan

機能していません。または親切に反応の構造を教えてください。私はconst ddd = window.location.href;
Shurvir Mori

1
webpackはこれについて「ウィンドウが定義されていません」と不満を言うでしょう
Franz See

@FranzSeeはい、サーバー側のコードに「ウィンドウ」はありません。そのため、それがあなたの環境である場合はreq.originalUrl、エクスプレスなどの何かを使用する必要があります。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

「react-router」をまだ使用していない場合は、次を使用してインストールできます。

yarn add react-router

次に、「ルート」内のReact.Componentで、次を呼び出すことができます。

this.props.location.pathname

これは、ドメイン名を含まないパスを返します。

ありがとう@ abdulla-zulqarnain!


2
パス名に対しても同じようにできますwindow.location.pathname
Abdulla Zulqarnain


13

あなたは得ています undefinedあなたは、おそらくコンポーネントが外部のルータに反応したため。

呼び出し元this.props.location<Route />コンポーネントが次のようなコンポーネント内にあることを確認する必要があることに注意してください。

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

次に、ダッシュボードコンポーネント内で、this.props.location...にアクセスできます。


3
また、コンポーネントが内部にない<Route />場合は、withRouter高次コンポーネントを使用できます。
Ahmad Maleki

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

このページにもう少しドキュメントを追加するだけです-私はこの問題にしばらく取り組んでいます。

上記のように、URLを取得する最も簡単な方法はを使用することwindow.location.hrefです。

次に、以下を使用して、バニラJavascriptを介してURLの一部を抽出できます。 let urlElements = window.location.href.split('/')

次にconsole.log(urlElements)、URLで.split()を呼び出して生成された要素の配列を確認します。

アクセスしたい配列のインデックスが見つかったら、これを変数に割り当てることができます

let urlElelement = (urlElements[0])

これで、URLの特定の部分となるurlElementの値をどこでも使用できます。


0

他の誰かが述べたように、最初に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代わりに使用しないのですか?


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.