Next.js
でのブラウザバック時の状態保持
Next.js
でWebアプリを開発する際、ブラウザバックを行ったときに状態を保持することは、ユーザー体験を向上させる重要な要素です。この記事では、Next.js
でブラウザバック時に状態を保持するための具体的な方法を紹介します。
useRouter
とbeforePopState
の活用
Next.js
のuseRouter
フックを使うことで、ブラウザの戻る操作に対して適切な処理を行うことができます。特にbeforePopState
メソッドを使えば、ブラウザバック時にカスタムのロジックを追加することが可能です。
import { useRouter } from 'next/router';
const PageComponent = () => {
const router = useRouter();
useEffect(() => {
const handlePopState = () => {
// 状態を保持するためのカスタムロジック
const confirmed = window.confirm('戻りますか?');
if (!confirmed) {
router.push(router.asPath); // URLを保持
}
};
router.beforePopState(handlePopState);
return () => router.beforePopState(() => true);
}, [router]);
return <div>コンテンツ</div>;
};
これにより、ブラウザバック時に確認ダイアログを表示し、ユーザーが誤って状態を失わないようにできます。
RecoilやsessionStorage
を使った状態管理
Next.js
では、Reactの状態管理ライブラリであるRecoil
や、ブラウザのsessionStorage
を使用して、ページをまたいでも状態を保持できます。特にRecoilSync
を使うと、状態を外部ストレージに簡単に同期させ、ブラウザバック時にその状態を復元することができます。
import { atom, useRecoilState } from 'recoil';
const countState = atom({
key: 'countState',
default: 0,
});
const CounterComponent = () => {
const [count, setCount] = useRecoilState(countState);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
};
sessionStorage
を使う場合も、状態を一時的に保存し、ページ遷移やブラウザバック時にそのデータを復元することが可能です。
URLパラメータで状態を管理
UIの状態(例えばモーダルの開閉状態など)をブラウザバック時にも保持したい場合、URLに状態を含める方法が有効です。これにより、ユーザーがページ遷移を行っても、特定の状態をURLパラメータから復元できます。
const ModalPage = () => {
const router = useRouter();
const [isOpen, setIsOpen] = useState(false);
useEffect(() => {
if (router.query.modal === 'open') {
setIsOpen(true);
}
}, [router.query]);
const openModal = () => {
router.push('/page?modal=open');
setIsOpen(true);
};
return (
<div>
{isOpen && <div>モーダルの内容</div>}
<button onClick={openModal}>モーダルを開く</button>
</div>
);
};
URLにモーダルの状態を反映させることで、ブラウザバック時にもUIの状態を維持できます。
まとめ
Next.js
でブラウザバック時に状態を保持するには、useRouter
や状態管理ライブラリを駆使することが重要です。また、URLパラメータやsessionStorage
を活用することで、UIやフォームの状態をユーザーがブラウザバックした際に復元でき、よりシームレスなユーザー体験を提供できます。