5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

react-hook-formのhandleSubmit関数を直接呼び出す際の注意点

Last updated at Posted at 2023-08-27

事象

react-hook-formを使用してフォームの送信処理を実装していた際、handleSubmit関数の末尾に()をつけ忘れたことで、フォームを送信しても指定したコールバック関数が実行されないという問題が発生しました。具体的には、送信ボタンをクリックしても何も反応がなく、ブラウザのコンソールにもエラーメッセージは表示されませんでした。初めは他の原因を疑い、コードのデバッグを試みましたが、最終的にはhandleSubmit関数の呼び出し方に問題があることを発見しました。

PaymentStatus.tsx
import { FormProvider, useForm } from "react-hook-form";

const PaymentStatus: React.FC<Props> = (props) => {
  const formMethods = useForm<{ ... }>();
  const { handleSubmit } = formMethods;

  const onSubmit = (e: React.FormEvent<HTMLFormElement>) => {
    // フォームのデフォルトの送信動作(ページのリロードを伴う)をキャンセルします
    e.preventDefault();
    handleSubmit((params: { ... }) => {
      // ここで実際の処理を行うコールバック関数を呼び出し、その後()で関数を実行します
    })();
  };

  return (
    <FormProvider {...formMethods}>
      <form onSubmit={onSubmit}>
        ...
      </form>
    </FormProvider>
  );
};

対処法

上記のように、handleSubmit関数の後に()を追加することで、内部のコールバック関数が正しく呼び出されるようになります。

handleSubmit関数の後に()が必要な理由

handleSubmit関数は、内部でフォームのバリデーションやエラーハンドリングを行った後、指定されたコールバック関数を実行する関数を返します。したがって、handleSubmit関数を呼び出すと、新しい関数が返されます。この返された関数を実行するためには、()を使用して呼び出す必要があります。

自らの備忘録のために投稿してますが、なにかお役に立てましたら幸いです!:clap:
また、なにか間違ってましたらご指摘いただけますと幸いです!:pray:

5
5
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
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?