From fead9d7d25d8acfd37f301a166822f50adbdee28 Mon Sep 17 00:00:00 2001 From: tubone Date: Sun, 7 Mar 2021 13:12:47 +0000 Subject: [PATCH 1/9] =?UTF-8?q?Create=20Blog=20=E2=80=9C2021-03-07-react-h?= =?UTF-8?q?ook-form=E3=81=A8getform-io=E3=82=92=E4=BD=BF=E3=81=A3=E3=81=A6?= =?UTF-8?q?=E3=80=81=E3=81=8A=E5=95=8F=E3=81=84=E5=90=88=E3=82=8F=E3=81=9B?= =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=BC=E3=83=A0=E3=82=92=E4=BD=9C=E3=82=8D?= =?UTF-8?q?=E3=81=86=EF=BC=81=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...34\343\202\215\343\201\206\357\274\201.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 "src/content/2021-03-07-react-hook-form\343\201\250getform-io\343\202\222\344\275\277\343\201\243\343\201\246\343\200\201\343\201\212\345\225\217\343\201\204\345\220\210\343\202\217\343\201\233\343\203\225\343\202\251\343\203\274\343\203\240\343\202\222\344\275\234\343\202\215\343\201\206\357\274\201.md" diff --git "a/src/content/2021-03-07-react-hook-form\343\201\250getform-io\343\202\222\344\275\277\343\201\243\343\201\246\343\200\201\343\201\212\345\225\217\343\201\204\345\220\210\343\202\217\343\201\233\343\203\225\343\202\251\343\203\274\343\203\240\343\202\222\344\275\234\343\202\215\343\201\206\357\274\201.md" "b/src/content/2021-03-07-react-hook-form\343\201\250getform-io\343\202\222\344\275\277\343\201\243\343\201\246\343\200\201\343\201\212\345\225\217\343\201\204\345\220\210\343\202\217\343\201\233\343\203\225\343\202\251\343\203\274\343\203\240\343\202\222\344\275\234\343\202\215\343\201\206\357\274\201.md" new file mode 100644 index 0000000000..5e498be51c --- /dev/null +++ "b/src/content/2021-03-07-react-hook-form\343\201\250getform-io\343\202\222\344\275\277\343\201\243\343\201\246\343\200\201\343\201\212\345\225\217\343\201\204\345\220\210\343\202\217\343\201\233\343\203\225\343\202\251\343\203\274\343\203\240\343\202\222\344\275\234\343\202\215\343\201\206\357\274\201.md" @@ -0,0 +1,20 @@ +--- +slug: 2021/03/07/react-hook-form +title: React Hook FormとGetform.ioを使って、お問い合わせフォームを作ろう! +date: 2021-03-07T13:03:39.605Z +description: 最近人気のReact Hook FormをGetform.ioと組み合わせてお問い合わせフォームを作りましょう。 +tags: + - JavaScript + - React + - getform.io +headerImage: https://i.imgur.com/DsrFLOE.png +templateKey: blog-post +--- +[React Hook Form](https://react-hook-form.com/jp/)が便利らしいと聞いたので使ってみることにしました。 + + +## Table of Contents + +```toc + +``` From 504bd944f0d2ef11c32437af1fdfbf12ff707bd1 Mon Sep 17 00:00:00 2001 From: tubone Date: Sun, 7 Mar 2021 22:29:13 +0900 Subject: [PATCH 2/9] =?UTF-8?q?Update=202021-03-07-react-hook-form?= =?UTF-8?q?=E3=81=A8getform-io=E3=82=92=E4=BD=BF=E3=81=A3=E3=81=A6?= =?UTF-8?q?=E3=80=81=E3=81=8A=E5=95=8F=E3=81=84=E5=90=88=E3=82=8F=E3=81=9B?= =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=BC=E3=83=A0=E3=82=92=E4=BD=9C=E3=82=8D?= =?UTF-8?q?=E3=81=86=EF=BC=81.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...34\343\202\215\343\201\206\357\274\201.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/src/content/2021-03-07-react-hook-form\343\201\250getform-io\343\202\222\344\275\277\343\201\243\343\201\246\343\200\201\343\201\212\345\225\217\343\201\204\345\220\210\343\202\217\343\201\233\343\203\225\343\202\251\343\203\274\343\203\240\343\202\222\344\275\234\343\202\215\343\201\206\357\274\201.md" "b/src/content/2021-03-07-react-hook-form\343\201\250getform-io\343\202\222\344\275\277\343\201\243\343\201\246\343\200\201\343\201\212\345\225\217\343\201\204\345\220\210\343\202\217\343\201\233\343\203\225\343\202\251\343\203\274\343\203\240\343\202\222\344\275\234\343\202\215\343\201\206\357\274\201.md" index 5e498be51c..4f2343e684 100644 --- "a/src/content/2021-03-07-react-hook-form\343\201\250getform-io\343\202\222\344\275\277\343\201\243\343\201\246\343\200\201\343\201\212\345\225\217\343\201\204\345\220\210\343\202\217\343\201\233\343\203\225\343\202\251\343\203\274\343\203\240\343\202\222\344\275\234\343\202\215\343\201\206\357\274\201.md" +++ "b/src/content/2021-03-07-react-hook-form\343\201\250getform-io\343\202\222\344\275\277\343\201\243\343\201\246\343\200\201\343\201\212\345\225\217\343\201\204\345\220\210\343\202\217\343\201\233\343\203\225\343\202\251\343\203\274\343\203\240\343\202\222\344\275\234\343\202\215\343\201\206\357\274\201.md" @@ -18,3 +18,29 @@ templateKey: blog-post ```toc ``` + +## React Hook Form + +皆さん、[React Hook Form](https://react-hook-form.com/jp/)を知ってますか? + +最近トレンドに乗っかってきた、FormをReact Hooksで簡単に作ることのできる代物です。 + +![img](https://i.imgur.com/2dqEW7L.png) + +特徴として、Hooksを使って簡単にFormが作れる、そして再レンダリングが最小限に抑えられているのでパフォーマンスも高い、らしいです。 + +## Getform.io + +[Getform.io](https://getform.io/)はフォームのバックエンドを提供するすばらしいサービスです。 + +詳しくは[こちらの過去記事](https://blog.tubone-project24.xyz/2021/02/13/netlify-github-action#getformio)をご確認いただければと思います。 + +## React Hook Form + Getform.io + +合体! + +![img](https://i.imgur.com/FzX8di6.jpg) + +だめ~となるかと思いましたがうまいことできました。 + +![img](https://i.imgur.com/yYJBK98.jpg) From 0d1923f806ac6e39e8474ca8b717d3b943f07b68 Mon Sep 17 00:00:00 2001 From: tubone Date: Sun, 7 Mar 2021 22:46:33 +0900 Subject: [PATCH 3/9] =?UTF-8?q?Update=202021-03-07-react-hook-form?= =?UTF-8?q?=E3=81=A8getform-io=E3=82=92=E4=BD=BF=E3=81=A3=E3=81=A6?= =?UTF-8?q?=E3=80=81=E3=81=8A=E5=95=8F=E3=81=84=E5=90=88=E3=82=8F=E3=81=9B?= =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=BC=E3=83=A0=E3=82=92=E4=BD=9C=E3=82=8D?= =?UTF-8?q?=E3=81=86=EF=BC=81.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...34\343\202\215\343\201\206\357\274\201.md" | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git "a/src/content/2021-03-07-react-hook-form\343\201\250getform-io\343\202\222\344\275\277\343\201\243\343\201\246\343\200\201\343\201\212\345\225\217\343\201\204\345\220\210\343\202\217\343\201\233\343\203\225\343\202\251\343\203\274\343\203\240\343\202\222\344\275\234\343\202\215\343\201\206\357\274\201.md" "b/src/content/2021-03-07-react-hook-form\343\201\250getform-io\343\202\222\344\275\277\343\201\243\343\201\246\343\200\201\343\201\212\345\225\217\343\201\204\345\220\210\343\202\217\343\201\233\343\203\225\343\202\251\343\203\274\343\203\240\343\202\222\344\275\234\343\202\215\343\201\206\357\274\201.md" index 4f2343e684..2544b70fb4 100644 --- "a/src/content/2021-03-07-react-hook-form\343\201\250getform-io\343\202\222\344\275\277\343\201\243\343\201\246\343\200\201\343\201\212\345\225\217\343\201\204\345\220\210\343\202\217\343\201\233\343\203\225\343\202\251\343\203\274\343\203\240\343\202\222\344\275\234\343\202\215\343\201\206\357\274\201.md" +++ "b/src/content/2021-03-07-react-hook-form\343\201\250getform-io\343\202\222\344\275\277\343\201\243\343\201\246\343\200\201\343\201\212\345\225\217\343\201\204\345\220\210\343\202\217\343\201\233\343\203\225\343\202\251\343\203\274\343\203\240\343\202\222\344\275\234\343\202\215\343\201\206\357\274\201.md" @@ -44,3 +44,97 @@ templateKey: blog-post だめ~となるかと思いましたがうまいことできました。 ![img](https://i.imgur.com/yYJBK98.jpg) + +今回はお問い合わせフォームを作っていきます。 + +## 実コード + +```typescript +import React, {useState} from "react"; +import { useForm } from "react-hook-form"; +import Button from "./button"; +type Inputs = { + name: string, + email: string, + subject: string, + message: string, +}; + +const ContactForm = () => { + const [serverState, setServerState] = useState({ submitting: false, status: {ok: false, msg: ""} }); + const { register, handleSubmit, errors } = useForm(); + const handleServerResponse = (ok: boolean, msg: string) => { + setServerState({ submitting: true, status: { ok, msg } }); + }; + const onSubmit = (data: Inputs, e: any) => { + const formData = new FormData(); + formData.append("name", data.name) + formData.append("email", data.email) + formData.append("subject", data.subject) + formData.append("message", data.message) + fetch('https://getform.io/f/897f187e-876d-42a7-b300-7c235af72e6d', { + method: 'POST', + body: formData + }) + .then(() => { + e.target.reset(); + handleServerResponse(true, "Submitted!"); + }) + .catch((error) => { + alert(error) + console.error(error) + handleServerResponse(false, error.toString()); + }); + } + + return ( +
+

+ +

+

+ +

+

+ +

+

+