1. HOME
  2. ブログ
  3. エンジニアリング
  4. ServerActionsのローディング表示をuseActionStateで実装【Next.js】

BLOG

ブログ

エンジニアリング

ServerActionsのローディング表示をuseActionStateで実装【Next.js】

ServerActions実行中に ローディングを表示

本章では、useActionStateを使ってフォームの状態管理をする方法を学んでいきます。

チュートリアルの全体像

本チュートリアルを通じて学べる内容は以下のようになります。

  1. Next.jsの開発環境をセットアップ
  2. 画面デザインしながら基礎を学ぼう
  3. App Routerを理解して使ってみよう
  4. Next.js+Postgres+PrismaでDB設計
  5. サーバコンポーネントでデータ取得
  6. サーバアクションでデータ変更
  7. Vercel Blobで画像アップロード実装
  8. Suspenseでローディングをリッチに
  9. Zodを使ってバリデーション実装
  10. useActionStateでローディング実装
  11. Auth.js v5で認証機能導入
  12. Route HandlersでAPIを設計

動画で学びたい方はこちらから!

useActionStateのisPendingを使ってみよう

ユーザー登録のServerActionsを待機している間にローディングを表示します。

components/pages/register/register-form.tsx

"use client";

import Loader from "@/components/loaders/loader";
import { registerUser } from "@/lib/actions";
import clsx from "clsx";
import Link from "next/link";
import { useActionState } from "react";

export default function RegisterForm() {
  const initialState = {
    errors: {},
    message: null,
  };
  const [state, action, isPending] = useActionState(registerUser, initialState);
  return (
    <form
      action={action}
      className={clsx("relative", { "opacity-20": isPending })}
    >
      {/* 省略 */}
      <div className="mt-8 flex items-center justify-end">
        <Link
          className="rounded-md text-sm text-gray-600 underline hover:text-gray-900 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"
          href="/login"
        >
          すでにアカウントをお持ちの方はこちら
        </Link>
        <button
          type="submit"
          disabled={isPending}
          className="ml-4 inline-flex items-center rounded-md border border-transparent bg-gray-800 px-4 py-2 text-xs font-semibold uppercase tracking-widest text-white transition duration-150 ease-in-out hover:bg-gray-700 focus:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 active:bg-gray-900"
        >
          登録
        </button>
      </div>
      {isPending && <Loader />}
    </form>
  );
}

まとめ

以上、useActionStateを使ってフォームのローディング状態を管理する方法についてでした!

次回は認証機能の実装方法を学んでいきます。

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

関連記事