react-routerv4でクエリパラメータを取得する方法


87

プロジェクトでreact-router-dom4.0.0-beta.6を使用しています。私は次のようなコードを持っています:

<Route exact path="/home" component={HomePage}/>

そして、HomePageコンポーネントでクエリパラメータを取得したいと思います。location.search次のようなparamを見つけた?key=valueので、解析されません。

react-router v4でクエリパラメータを取得する正しい方法は何ですか?

回答:


181

クエリ文字列を解析する機能は、さまざまな実装をサポートするための要求が何年にもわたってあったため、V4から削除されました。それで、チームは、その実装がどのように見えるかをユーザーが決定するのが最善であると判断しました。クエリ文字列libをインポートすることをお勧めします。これが私が使っているものです

const queryString = require('query-string');

const parsed = queryString.parse(props.location.search);

new URLSearchParamsネイティブなものが必要で、ニーズに合っている場合にも使用できます

const params = new URLSearchParams(props.location.search);
const foo = params.get('foo'); // bar

あなたはここで決定についてもっと読むことができます


12
ポリフィルなしでURLSearchParamsを使用しないでください。2018年3月の時点で、GooglebotはURLSearchParamsをサポートしないChrome 41(developers.google.com/search/docs/guides/rendering)を使用しており、クリティカルパス(caniuse.com/#feat=urlsearchparams)で使用するとアプリが破損します。
ジョシュア・ロビンソン

12

与えられた答えは確かです。

クエリ文字列の代わりにqsモジュールを使用する場合(人気はほぼ同じです)、構文は次のとおりです。

const query = qs.parse(props.location.search, {
  ignoreQueryPrefix: true
})

ignoreQueryPrefixのオプションでは、主要な疑問符を無視することです。


1
いいね。2019年1月、qsの週あたりのダウンロード数は1200万であるのに対し、クエリ文字列は270万です。
oyalhi

6

受け入れられた答えはうまく機能しますが、追加のパッケージをインストールしたくない場合は、これを使用できます:

getUrlParameter = (name) => {
    name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
    let regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
    let results = regex.exec(window.location.search);
    return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
  };

与えられた http://www.google.co.in/?key=value

getUrlParameter('key');

戻ります value


トンメイトに感謝します。「クエリ文字列」ライブラリは何らかの理由で機能しませんでしたが、あなたのソリューションは魅力のように機能しました。「react-dom」:「^ 16.0.0」、「react-router」:「^ 4.2.0」、「react-router-dom」:「^ 4.2.2」、「query-string」を使用していました。 "^ 5.0.1"、
Rohan_Paul 2017

これは、クエリ文字列に単一のパラメータがあることを前提としています。OPは、クエリパラメータを取得する方法を明確に要求します。これは、前述のnpmモジュールが行うことです。これをクエリ文字列からキーと値のペアのオブジェクトを返す関数に変換すると、非常に便利です。
Andy Lorenz

@AndyLorenzこれは、複数のクエリパラメータがある場合でも機能し、値を取得するキーを使用して特定の関数を呼び出します。はいメソッドは、キー値のマップを提供するように変換することもできます。
kartikag01 2018年

それはうまくいくでしょうが、@ Kartik_Agarwalの良い解決策ではありません。(a)本質的に同じ(潜在的に高価な)コードを複数回実行する必要があります。(b)パラメーターごとに別々の変数を使用する必要がありますが、理想的には、キーと値のペアのオブジェクトを設定します。パラメータ名を知って、それらが存在するかどうかを確認するための追加のチェックを行います。これが私のコードである場合、すべてのパラメーターを繰り返し取得できる正規表現を探しますが、正規表現によって耳が出血することを認める必要があります。
Andy Lorenz

6

別の便利なアプローチは、URLSearchParamsこのように箱から出して使用することです。

  let { search } = useLocation();

   const query = new URLSearchParams(search);
   const paramField = query.get('field');
   const paramValue = query.get('value');

クリーンで読みやすく、モジュールを必要としません。以下の詳細情報;


5

私はreactrouter v4のパラメーターについて調べていましたが、react router v2 / 3とは異なり、v4では使用しませんでした。別の関数を残しておきます-多分誰かがそれが役に立つと思うでしょう。必要なのはes6またはプレーンJavaScriptのみです。

function parseQueryParams(query) {
  //You get a '?key=asdfghjkl1234567890&val=123&val2&val3=other'
  const queryArray = query.split('?')[1].split('&');
  let queryParams = {};
  for (let i = 0; i < queryArray.length; i++) {
    const [key, val] = queryArray[i].split('=');
    queryParams[key] = val ? val : true;
  }
  /* queryParams = 
     {
      key:"asdfghjkl1234567890",
      val:"123",
      val2:true,
      val3:"other"
     }
  */
  return queryParams;
}

また、この機能を向上させることができます


2

え?

queryfie(string){
    return string
        .slice(1)
        .split('&')
        .map(q => q.split('='))
        .reduce((a, c) => { a[c[0]] = c[1]; return a; }, {});
}

queryfie(this.props.location.search);

0

私はこれを作ったばかりなので、ルーターv4以降を下位バージョンから反応させるように更新する場合は、コード構造全体(reduxルーターストアからのクエリを使用する場所)を変更する必要はありません。

https://github.com/saltas888/react-router-query-middleware


1
ソリューションへのリンクは大歓迎ですが、それがなくても回答が役立つことを確認してください。リンクの周りにコンテキストを追加して、他のユーザーがそれが何であるか、なぜそこにあるのかを理解できるようにしてから、ページの最も関連性の高い部分を引用してください。ターゲットページが利用できない場合に再リンクします。リンクに過ぎない回答は削除される場合があります
mrun 2018年

0

非常に簡単

フックを使うだけ useParams()

例:

ルーター

<Route path="/user/:id" component={UserComponent} />

あなたのコンポーネントで:

export default function UserComponent() {

  const { id } = useParams();

  return (
    <>{id}</>
  );
}

これは、質問で説明されているユースケースでは機能しません(少なくともReact-Router v4では機能しません:reactrouter.com/web/api/Hooks/useparams)useParamsは、検索パラメーターではなく、パスパラメーターのみを公開します。
Bennit

-4

パッケージを必要としない:

const params = JSON.parse(JSON.stringify(this.props.match.params));

次に、関連するパラメータに到達できます。 params.id


3
this.props.match.paramsパスパラメータが含まれています。この質問はクエリパラメータに関するものです。
ヒューバート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.