🍺
[React Router] URLクエリストリングを取得する
React Router(v5)を使っていて、http://localhost:3000/books?hoge=1111&fuga=aiueo
というようなURLのクエリストリング?hoge=1&fuga=aiueo
を取得する方法をいくつか試してみました。なお、TypeScriptで実装しています。
自力で取得する
search
には?hoge=1111&fuga=aiueo
というような文字列がセットされています。この文字列を操作して無理やり取得してみました。何かものすごく制約がない限り、これは採用しないと思います。
import React from 'react';
import { useLocation } from 'react-router-dom';
interface QueryString {
[key: string]: string;
}
const Books: React.FC = () => {
const search = useLocation().search;
const query1 = search
.slice(1)
.split('&')
.map((str) => [str.split('=')[0], str.split('=')[1]])
.reduce((acc, a) => {
acc[a[0]] = a[1];
return acc;
}, {} as QueryString);
return (
<div>
<h2>Books Page</h2>
<div>hoge: {query1['hoge']}</div>
<div>fuga: {query1['fuga']}</div>
</div>
);
};
export default Books;
URLSearchParamsで取得する
React Routerのドキュメントに記載のある方法です。URLSearchParams
を使用します。一番シンプルで良さそうです。ただし、URLSearchParams
はIE未対応です。
import React from 'react';
import { useLocation } from 'react-router-dom';
const Books: React.FC = () => {
const search = useLocation().search;
const query2 = new URLSearchParams(search);
return (
<div>
<h2>Books Page</h2>
<div>hoge: {query2.get('hoge')}</div>
<div>fuga: {query2.get('fuga')}</div>
</div>
);
};
export default Books;
query-stringで取得する
query-string
というライブラリで取得できます。URLSearchParams
より複雑な変換が必要な場合に使うと良さそうです(GitHubのREADME.mdに様々なAPIの使用例が記載されています)。ただし、こちらもIE未対応のようです。
import React from 'react';
import { useLocation } from 'react-router-dom';
import queryString from 'query-string';
const Books: React.FC = () => {
const search = useLocation().search;
const query3 = queryString.parse(search);
return (
<div>
<h2>Books Page</h2>
<div>hoge: {query3['hoge']}</div>
<div>fuga: {query3['fuga']}</div>
</div>
);
};
export default Books;
まとめ
私が(仕事やプライベートにおいて)実装する範囲ではIE対応は不要なため、URLSearchParams
を使うかquery-string
を使うかの二択になりそうです。
Discussion