🦁
Next.jsでページ遷移後にトーストを表示する方法
はじめに
Next.jsでページ遷移後にトースト(通知)を表示したい場合、状態管理を使う方法もありますが、クライアント側で一時的にデータを保持するためにCookieを活用するのも便利です。
例えば、詳細ページで削除や編集を実行し、一覧ページに戻った際にトーストを表示したい場合、遷移時に情報を引き継ぐ必要があります。今回は Cookieを利用したトースト表示 の方法を紹介します。
実装の流れ
- 削除や編集時にトーストのメッセージをCookieに保存
- 一覧ページでCookieを取得し、トーストを表示
- トースト表示後にCookieを削除
実装
1. Cookieの操作用関数を作成
まず、サーバーアクションを活用してCookieを設定・取得・削除する関数を用意します。
📌 /actions/cookies.ts
"use server";
import { cookies } from "next/headers";
// Cookieを設定する
export const setCookieByKey = async (key: string, value: string) => {
(await cookies()).get(key);
};
// Cookieを取得する
export const getCookieByKey = async (key: string) => {
const cookie = (await cookies()).get(key);
if (!cookie) {
return null;
}
return cookie.value;
};
// Cookieを削除する
export const deleteCookieByKey = async (key: string) => {
(await cookies()).delete(key);
};
2. 削除や編集時にトーストメッセージをCookieに保存
例えば、詳細ページで削除処理を行った後に一覧ページにリダイレクトする際、トースト用のメッセージをCookieに保存します。
📌 /app/detail/page.tsx
"use client";
import { useRouter } from "next/navigation";
import { setCookieByKey } from "@/actions/cookies";
const DetailPage = () => {
const router = useRouter();
const handleDelete = async () => {
// 削除処理(API呼び出しなど)
await setCookieByKey("toast", "削除しました"); // トーストメッセージをCookieに保存
router.push("/list"); // 一覧ページへ遷移
};
return (
<div>
<h1>詳細ページ</h1>
<button onClick={handleDelete}>削除</button>
</div>
);
};
export { DetailPage };
3. 一覧ページでトーストを表示
一覧ページでトーストを表示するためのコンポーネント RedirectToast
を作成します。
📌 /components/redirect-toast.tsx
"use client";
import { useEffect } from "react";
import { toast } from "sonner";
import { deleteCookieByKey, getCookieByKey } from "@/actions/cookies";
const RedirectToast = () => {
useEffect(() => {
const showCookieToast = async () => {
const message = await getCookieByKey("toast");
if (message) {
toast.success(message);
await deleteCookieByKey("toast");
}
};
showCookieToast();
}, []);
return null;
};
export { RedirectToast };
4. 一覧ページでトーストを表示するコンポーネントを組み込む
一覧ページで RedirectToast
を読み込めば、リダイレクト後にトーストが表示されます。
📌 /app/list/page.tsx
import { RedirectToast } from "@/components/redirect-toast";
const ListPage = () => {
return (
<div>
<h1>一覧ページ</h1>
<RedirectToast />
{/* 他のコンテンツ */}
</div>
);
};
export { ListPage };
まとめ
- Cookieを使うことでページをまたいでトーストの表示が可能
-
setCookieByKey
でトーストのメッセージを保存 -
RedirectToast
で取得して表示し、deleteCookieByKey
で削除 -
useEffect
を活用し、クライアント側でトーストを表示
この方法を使えば、 一覧ページに戻った際にスムーズにトーストを表示 できます。サーバーアクションを利用することで簡潔なコードで実装できるのもメリットですね!
Discussion