正直に言うと、Reactにおけるフォームは非常に冗長です。さらに悪いことに、ほとんどのフォームヘルパーは非常に多くのマジックを行い、多くの場合、パフォーマンスに大きなコストがかかります。Formikは、最も厄介な3つの部分を助けてくれる小さなライブラリです。
上記のすべてを1箇所に配置することで、Formikは整理された状態を維持し、テスト、リファクタリング、フォームに関する推論を容易にします。
私(@jaredpalmer)は、@eonwhiteと共に大規模な内部管理ダッシュボードを構築している際にFormikを作成しました。約30種類の独自のフォームがあり、入力コンポーネントだけでなく、データがフォームを流れる方法も標準化することでメリットを得られることがすぐに明らかになりました。
今頃、「なぜRedux-Formを使わなかったのですか?」と思っているかもしれません。良い質問です。
Formikの目標は、最小限のAPIを持つスケーラブルで高性能なフォームヘルパーを作成し、本当に面倒なことを処理し、残りはユーザーに任せることでした。
React Alicanteでの私の講演では、Formikの動機と哲学をより深く掘り下げ、ライブラリを紹介し(ミニバージョンを作成する様子を見て)、実際のものを用いて非自明なフォーム(配列、カスタム入力など)の構築方法をデモします。
Formikは、この小さな高階コンポーネントをBrent Jacksonが拡張したことから始まり、Redux-Formからのいくつかの命名規則、そして(最近では)React-MotionとReact-Router 4によって普及したレンダープロップスアプローチの影響を受けています。上記を使用したことがあるかどうかに関係なく、Formikは数分で開始できます。
NPM、Yarn、またはunpkg.com経由の従来の<script>
を使用してFormikをインストールできます。
npm install formik --save
または
yarn add formik
FormikはReact v15以降と互換性があり、ReactDOMとReact Nativeで動作します。
このCodeSandbox.ioでのFormikのデモで、購入前に試すこともできます。
これらのライブオンラインプレイグラウンドで、WebブラウザでFormikを試すことができます。
Formikはフォームの状態を追跡し、props
を介してフォームにいくつかの再利用可能なメソッドとイベントハンドラ(handleChange
、handleBlur
、handleSubmit
)と合わせて公開します。handleChange
とhandleBlur
は期待どおりに機能し、name
属性またはid
属性を使用して更新するフィールドを特定します。
import React from 'react';import { Formik } from 'formik';const Basic = () => (<div><h1>Anywhere in your app!</h1><FormikinitialValues={{ 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}><inputtype="email"name="email"onChange={handleChange}onBlur={handleBlur}value={values.email}/>{errors.email && touched.email && errors.email}<inputtype="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
-> handleChange
、onBlur
-> handleBlur
などです。しかし、時間を節約するために、Formikには、生活をより簡単に、より簡潔にするための追加のコンポーネントがいくつか用意されています。<Form />
、<Field />
、<ErrorMessage />
です。これらはReactコンテキストを使用して、親<Formik />
の状態/メソッドにフックします。
// Render Propimport React from 'react';import { Formik, Form, Field, ErrorMessage } from 'formik';const Basic = () => (<div><h1>Any place in your app!</h1><FormikinitialValues={{ 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のバリデーションエラーを、キーがvalues
とtouched
に一致する美しいオブジェクトに変換します。とにかく、npmからYupをインストールできます…
npm install yup --save
または
yarn add yup
最新のFormikニュース、記事、リソースをメールで受信します。