0
0

Next.jsでページ遷移後、リロードする

Posted at

ページ遷移後、遷移先をリロードしたいと思い、うまくいったやり方があったので綴ります。

js#home.jsx
'use client'

import {useRouter, useSearchParams} from 'next/navigation';

const Home = () => {
  const searchParams = useSearchParams();
  const router = useRouter();

  //パラメータを割り当てる
  const isReload = seachParam.get('reload');
  const isReload2 = localStorage.getItem('reloaded');
  if (isReload && !isReload) {
    localStorage.setItem('reloaded','true');
    router.replace('/home');
    window.location.reload();
  } else if(!isReload) {
    localStorage.removeItem('reloaded');
  }
  
  return <Child />
}

export default Home;
js#child.jsx
'useClient'
//next/navigationからインポートする
import useRouter from 'next/navigation'

const Child = () => {
  const router = useRouter();

  const handleClick = () => {
    router.push('/home?reload=true');
  }
  
  return <button onClick={handleClick}>遷移する</button>
}

export default Child;

window.location.reload()を実行すると無限にページをリロードしてしまうので少し工夫が必要でした。

初めは下記を記述していました。

let isReload = true;

if (isReload) {
  isReload = false;
  window.location.reload();
}

ダメですね。リロードするたびに変数の値がtrueに戻ってしまうせいで無限リロードしました。

そこでローカルストレージに保存する方法を試すとうまくいきました。

js#home.jsx
const isReload = seachParams.get('reload');
const isReload2 = localStorage.getItem('reloaded');

if (isReload && !isReload) {
  localStorage.setItem('reloaded','true');
  router.replace('/home');
  window.location.reload();
}

初めはローカルストレージに何も入っていないので反転させてtrueを返し、ifの中でtrueをセットするようにしています。
その後、useSearchParamsにパラメータを返さないように置き換えています。

js#home.jsx
} else if(!isReload) {
  localStorage.removeItem('reloaded');
}

上記のelse ifを記述しないと無限にリロードされるので注意です。

それと今回はクライアントサイドで実装しているのでuseRouterをnext/navigationからインポートするところも注意です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0