Open1

ReactでブラウザのURLをrerender無しで更新する

kenfdevkenfdev

画面のタブの切り替えをしたとき、URLでそれを同期しておきたいときがある(ブックマークだったり、再読み込みしたときに復元できるように)。

Next.jsを使っていると例えば router.push{shallow: true} して更新できるような気もしますが、基本的に状態が変わってしまう影響でrerenderしてしまう。これが意図していれば良いのですが、まったくもってrerenderすらしたくないときもある。

そういうときは以下のように window.history.replaceState が使えます。題名に「React」とつけてますがただのJavaScriptなのでどこででも使える方法です。これはReactとは関係の無い世界なのでrerenderも走りません。

// valueはクエリパラメータに設定したい値
const value = 'some-param-value'

const url = new URL(window.location.href);
const searchParams = url.searchParams;
searchParams.set('someparam', value);

url.search = searchParams.toString();
const newUrl = url.toString();
window.history.replaceState(
  { ...window.history.state, as: newUrl, url: newUrl },
  undefined,
  newUrl
);

ソースはこちら。
https://github.com/vercel/next.js/discussions/18072#discussioncomment-109059

window.history..replaceState
https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState