thumbnail

Next.jsとNetlifyでフォームを使う方法~画面遷移しない方法も解説~

NetlifyでNext.jsのフォームを使う方法を解説します。送信後に画面遷移せずコンポーネントのみを切り替える方法、画面遷移する方法のいずれも説明します。一般的なケースに加え、Styled-componentsとReact Hook Formを利用したケースについてもコード例を掲載します。

Netlify+Next.jsでフォームを使う方法

Netlify+Next.jsでフォームを使う方法はすでに多くの記事が出回っていますが、この記事でも解説します。一般的なケースに加え、Styled-componentsとReact Hook Formを利用したケースについてもコード例を掲載します。

Netlify側で特別な設定をしないでも、ソースコード内のformタグに以下の数個のコードを加えるだけで、Netlifyの管理画面上でフォームの内容を受け取ることが可能になります。

それではその方法を順番に解説していきます。大きく3ステップに分けることができます。

①formタグにdata-netlify属性とname属性を指定

formタグに、data-netlify=”true”とname=”任意の名前”属性を指定します。

<form data-netlify="true" name="任意の名前">

Styled-componentsを利用しているなら、次のように指定した方が確実です。

const Form = styled.form.attrs({
  name: "任意の名前",
  "data-netlify": "true"
})`
  // 何らかのスタイリング
`

②form内にtype=”hidden”のinput要素を追加

form内に以下のコードを追加します。

<input type="hidden" name="form-name" value="contact" />

React Hook Formを利用しているならば、次のようなコードの概略になります。以下の例は、name, email, messageの3つのフォーム要素を持つformの例です。フォームの内容、useFormのオプションやレンダリングするコンポーネントの内容は適宜変更してください。

type FormData = {
  name: string
  email: string
  message: string
  "form-name": string
}
const Component = () => {
  const {
    register,
    handleSubmit,
    formState: { errors, dirtyFields },
  } = useForm<FormData>({
    mode: 'onChange',
  })
  const onSubmit = () => {/*何らかの処理*/}
  //いろいろなコード
  return (
    <Form onSubmit={handleSubmit(onSubmmit)}>
      <input type="hidden" {...register("form-name") value="任意の名前"/>
      {/* その他のフォームが続く */}
    </Form>
  )
}

③ルートディレクトリにPOSTする

fetchやaxios等でルートディレクトリにPOSTします。POST後の処理は任意に書くことができるので、ページ遷移してもよし、stateの変更をするだけでもよし。上のコードのonSubmit関数の中身を実装していくことになります。

  const onSubmit = (data: FormData) => {
    fetch('/', {
      method: 'POST',
      headers: { "Content-Type": "application/x-www-form-urlencoded" },
      body: new URLSearchParams(data).toString(),
    })
      .then(() => {
        // 任意の処理を書く。例えばStateを変更したり、router.pushでページ遷移したり
        setIsSend(true)
        onCompleted()
      })
      .catch(() => setIsError(true))
  }

設定は以上です。これだけで、Netlifyでビルド時に勝手にformを識別してくれて、管理画面からフォームのやり取りができるようになります。受け取ったフォームをメールアドレスに転送する設定なども可能です。

参考