概要

正直に言うと、Reactにおけるフォームは非常に冗長です。さらに悪いことに、ほとんどのフォームヘルパーは非常に多くのマジックを行い、多くの場合、パフォーマンスに大きなコストがかかります。Formikは、最も厄介な3つの部分を助けてくれる小さなライブラリです。

  1. フォームの状態への値の入出力
  2. バリデーションとエラーメッセージ
  3. フォーム送信の処理

上記のすべてを1箇所に配置することで、Formikは整理された状態を維持し、テスト、リファクタリング、フォームに関する推論を容易にします。

動機

私(@jaredpalmer)は、@eonwhiteと共に大規模な内部管理ダッシュボードを構築している際にFormikを作成しました。約30種類の独自のフォームがあり、入力コンポーネントだけでなく、データがフォームを流れる方法も標準化することでメリットを得られることがすぐに明らかになりました。

なぜRedux-Formではないのか?

今頃、「なぜRedux-Formを使わなかったのですか?」と思っているかもしれません。良い質問です。

  1. 私たちの預言者Dan Abramovによると、フォームの状態は本質的に一時的でローカルであるため、Redux(またはFluxライブラリのいずれか)で追跡する必要はありません
  2. Redux-Formは、**すべてのキーストロークごとに**トップレベルのRedux reducer全体を複数回呼び出します。これは小さなアプリケーションでは問題ありませんが、Reduxアプリケーションが大きくなると、Redux-Formを使用した場合、入力レイテンシが増加し続けます。
  3. Redux-Formはミニファイされたgzip圧縮後で22.5 kBです(Formikは12.7 kBです)。

Formikの目標は、最小限のAPIを持つスケーラブルで高性能なフォームヘルパーを作成し、本当に面倒なことを処理し、残りはユーザーに任せることでした。


React Alicanteでの私の講演では、Formikの動機と哲学をより深く掘り下げ、ライブラリを紹介し(ミニバージョンを作成する様子を見て)、実際のものを用いて非自明なフォーム(配列、カスタム入力など)の構築方法をデモします。

影響

Formikは、この小さな高階コンポーネントBrent Jacksonが拡張したことから始まり、Redux-Formからのいくつかの命名規則、そして(最近では)React-MotionReact-Router 4によって普及したレンダープロップスアプローチの影響を受けています。上記を使用したことがあるかどうかに関係なく、Formikは数分で開始できます。

インストール

NPMYarn、またはunpkg.com経由の従来の<script>を使用してFormikをインストールできます。

NPM

npm install formik --save

または

yarn add formik

FormikはReact v15以降と互換性があり、ReactDOMとReact Nativeで動作します。

このCodeSandbox.ioでのFormikのデモで、購入前に試すこともできます。

ブラウザ内プレイグラウンド

これらのライブオンラインプレイグラウンドで、WebブラウザでFormikを試すことができます。

要約

Formikはフォームの状態を追跡し、propsを介してフォームにいくつかの再利用可能なメソッドとイベントハンドラ(handleChangehandleBlurhandleSubmit)と合わせて公開します。handleChangehandleBlurは期待どおりに機能し、name属性またはid属性を使用して更新するフィールドを特定します。

import React from 'react';
import { Formik } from 'formik';
const Basic = () => (
<div>
<h1>Anywhere in your app!</h1>
<Formik
initialValues={{ email: '', password: '' }}
validate={values => {
const errors = {};
if (!values.email) {
errors.email = 'Required';
} else if (
!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(values.email)
) {
errors.email = 'Invalid email address';
}
return errors;
}}
onSubmit={(values, { setSubmitting }) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
setSubmitting(false);
}, 400);
}}
>
{({
values,
errors,
touched,
handleChange,
handleBlur,
handleSubmit,
isSubmitting,
/* and other goodies */
}) => (
<form onSubmit={handleSubmit}>
<input
type="email"
name="email"
onChange={handleChange}
onBlur={handleBlur}
value={values.email}
/>
{errors.email && touched.email && errors.email}
<input
type="password"
name="password"
onChange={handleChange}
onBlur={handleBlur}
value={values.password}
/>
{errors.password && touched.password && errors.password}
<button type="submit" disabled={isSubmitting}>
Submit
</button>
</form>
)}
</Formik>
</div>
);
export default Basic;

ボイラープレートの削減

上記のコードは、Formikが実行していることを正確に示しています。onChange -> handleChangeonBlur -> handleBlurなどです。しかし、時間を節約するために、Formikには、生活をより簡単に、より簡潔にするための追加のコンポーネントがいくつか用意されています。<Form /><Field /><ErrorMessage />です。これらはReactコンテキストを使用して、親<Formik />の状態/メソッドにフックします。

// Render Prop
import React from 'react';
import { Formik, Form, Field, ErrorMessage } from 'formik';
const Basic = () => (
<div>
<h1>Any place in your app!</h1>
<Formik
initialValues={{ email: '', password: '' }}
validate={values => {
const errors = {};
if (!values.email) {
errors.email = 'Required';
} else if (
!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(values.email)
) {
errors.email = 'Invalid email address';
}
return errors;
}}
onSubmit={(values, { setSubmitting }) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
setSubmitting(false);
}, 400);
}}
>
{({ isSubmitting }) => (
<Form>
<Field type="email" name="email" />
<ErrorMessage name="email" component="div" />
<Field type="password" name="password" />
<ErrorMessage name="password" component="div" />
<button type="submit" disabled={isSubmitting}>
Submit
</button>
</Form>
)}
</Formik>
</div>
);
export default Basic;

詳細については以下をお読みください…

補足パッケージ

上記のように、バリデーションはユーザーに任されています。独自のバリデータを作成するか、サードパーティライブラリを使用してください。個人的には、オブジェクトスキーマのバリデーションにYupを使用しています。Joi / React PropTypesと非常によく似たAPIを持っていますが、ブラウザにとって十分小さく、ランタイム使用に十分な速度です。Yupが大好きなので、FormikにはvalidationSchemaというYup用の特別な設定オプション/プロップがあり、Yupのバリデーションエラーを、キーがvaluestouchedに一致する美しいオブジェクトに変換します。とにかく、npmからYupをインストールできます…

npm install yup --save

または

yarn add yup
このページは役に立ちましたか?

ニュースレターを購読する

最新のFormikニュース、記事、リソースをメールで受信します。

Copyright © 2020 Formium, Inc. All rights reserved.