<Formik>
は、フォームの構築を支援するコンポーネントです。React MotionやReact Routerなどのライブラリで普及したレンダープロップスパターンを使用します。
import React from 'react';import { Formik } from 'formik';const BasicExample = () => (<div><h1>My Form</h1><FormikinitialValues={{ name: 'jared' }}onSubmit={(values, actions) => {setTimeout(() => {alert(JSON.stringify(values, null, 2));actions.setSubmitting(false);}, 1000);}}>{props => (<form onSubmit={props.handleSubmit}><inputtype="text"onChange={props.handleChange}onBlur={props.handleBlur}value={props.values.name}name="name"/>{props.errors.name && <div id="feedback">{props.errors.name}</div>}<button type="submit">Submit</button></form>)}</Formik></div>);
<Formik />
を使用してレンダリングするには、2つの方法があります。
<Formik component>
<Formik children>
<Formik render>
各レンダーメソッドには同じプロパティが渡されます
dirty: boolean
値が初期値と完全に等しくない場合は true
、それ以外の場合は false
を返します。dirty
は読み取り専用の計算されたプロパティであり、直接変更しないでください。
errors: { [field: string]: string }
フォームの検証エラー。initialValues
で定義されたフォームのvalues
の形状と一致する必要があります。validationSchema
(使用することをお勧めします)を使用している場合、キーと形状はスキーマと正確に一致します。内部的には、Formikは生のYup検証エラーを変換します。validate
を使用している場合、その関数はerrors
オブジェクトの形状を決定します。
handleBlur: (e: any) => void
onBlur
イベントハンドラー。入力がtouched
かどうかを追跡する必要がある場合に役立ちます。これは<input onBlur={handleBlur} ... />
に渡す必要があります。
handleChange: (e: React.ChangeEvent<any>) => void
一般的な入力変更イベントハンドラー。これにより、values[key]
が更新されます。ここで、key
はイベントを発生させた入力のname
属性です。name
属性が存在しない場合、handleChange
は入力のid
属性を探します。注:「入力」はここですべてのHTML入力を意味します。
handleReset: () => void
リセットハンドラー。フォームを初期状態にリセットします。これは<button onClick={handleReset}>...</button>
に渡す必要があります。
handleSubmit: (e: React.FormEvent<HTMLFormElement>) => void
送信ハンドラー。これは<form onSubmit={props.handleSubmit}>...</form>
に渡す必要があります。送信プロセスの詳細については、フォーム送信を参照してください。
isSubmitting: boolean
フォームの送信状態。送信が進行中の場合はtrue
、それ以外の場合はfalse
を返します。重要:Formikは、送信が試行されるとすぐにこれをtrue
に設定します。送信プロセスの詳細については、フォーム送信を参照してください。
isValid: boolean
errors
がない場合(つまり、errors
オブジェクトが空の場合)はtrue
、それ以外の場合はfalse
を返します。
注:
isInitialValid
は2.xで非推奨になりました。ただし、下位互換性のために、isInitialValid
プロパティが指定されている場合、errors
がない場合、またはフォームが「pristine」(つまり、dirty
ではない)状態の場合はisInitialValid
の結果がtrue
を返します。
isValidating: boolean
送信中、または呼び出し中にFormikが検証を実行している場合はtrue
を返します。[validateForm
]それ以外の場合は直接false
。送信プロセス中にisValidating
で何が起こるかについて詳しくは、フォーム送信を参照してください。
resetForm: (nextState?: Partial<FormikState<Values>>) => void
フォームを命令的にリセットします。唯一の(オプションの)引数であるnextState
は、これらのFormikState
フィールドのいずれかがオプションのオブジェクトです
interface FormikState<Values> {/** Form values */values: Values;/** map of field names to specific error for that field */errors: FormikErrors<Values>;/** map of field names to **whether** the field has been touched */touched: FormikTouched<Values>;/** whether the form is currently submitting */isSubmitting: boolean;/** whether the form is currently validating (prior to submission) */isValidating: boolean;/** Top level status state, in case you need it */status?: any;/** Number of times user tried to submit the form */submitCount: number;}
nextState
が指定されている場合、FormikはnextState.values
を新しい「初期状態」として設定し、nextState
の関連値を使用して、フォームのinitialValues
とinitialTouched
、initialStatus
、initialErrors
を更新します。これは、変更を加えた後にフォームの初期状態(つまり、「ベース」)を変更するのに役立ちます。
// typescript usagefunction MyForm(props: MyFormProps) {// using TSX Generics here to set <Values> to <Blog>return (<Formik<Blog>initialValues={props.initVals}onSubmit={(values, actions) => {props.onSubmit(values).then(() => {actions.setSubmitting(false);actions.resetForm({values: {// the type of `values` inferred to be Blogtitle: '',image: '',body: '',},// you can also set the other form states here});});}}>// etc</Formik>);}
nextState
が省略された場合、Formikは状態を元の初期状態にリセットします。後者は、componentDidUpdate
またはuseEffect
内でresetForm
を呼び出すのに役立ちます。
actions.resetForm();
setErrors: (fields: { [field: string]: string }) => void
errors
を命令的に設定します。
setFieldError: (field: string, errorMsg: string) => void
フィールドのエラーメッセージを命令的に設定します。field
は、更新したいerrors
のキーと一致する必要があります。カスタム入力エラーハンドラーを作成するのに役立ちます。
setFieldTouched: (field: string, isTouched?: boolean, shouldValidate?: boolean) => Promise<void | FormikErrors>
フィールドのタッチ状態を命令的に設定します。field
は、更新したいtouched
のキーと一致する必要があります。カスタム入力ぼかしハンドラーを作成するのに役立ちます。このメソッドを呼び出すと、validateOnBlur
がtrue
に設定されている場合(デフォルトで設定されています)、検証が実行されます。isTouched
は、指定しない場合はデフォルトでtrue
になります。3番目の引数としてfalse
を渡して、検証を明示的に防止/スキップすることもできます。
validateOnBlur
がtrue
に設定されていて、エラーがある場合は、返されたPromise
で解決されます。
submitForm: () => Promise
フォーム送信をトリガーします。フォームが無効な場合、プロミスは拒否されます。
submitCount: number
ユーザーがフォームを送信しようとした回数。handleSubmit
が呼び出されると増加し、handleReset
を呼び出した後にリセットされます。submitCount
は読み取り専用の計算されたプロパティであり、直接変更しないでください。
setFieldValue: (field: string, value: React.SetStateAction<any>, shouldValidate?: boolean) => Promise<void | FormikErrors>
フィールドの値を命令的に設定します。field
は、更新したいvalues
のキーと一致する必要があります。カスタム入力変更ハンドラーを作成するのに役立ちます。これを呼び出すと、validateOnChange
がtrue
(デフォルトで設定されています)に設定されている場合、検証が実行されます。3番目の引数としてfalse
を渡して、検証を明示的に防止/スキップすることもできます。
validateOnChange
がtrue
に設定されていて、エラーがある場合は、返されたPromise
で解決されます。
setStatus: (status?: any) => void
最上位のstatus
を、命令的に必要なものに設定します。フォームに関連する任意の最上位の状態を制御するのに役立ちます。たとえば、handleSubmit
でAPI応答をコンポーネントに渡すために使用できます。
setSubmitting: (isSubmitting: boolean) => void
isSubmitting
を命令的に設定します。onSubmit
ハンドラーでsetSubmitting(false)
を呼び出してサイクルを終了します。送信プロセスの詳細については、フォーム送信を参照してください。
setTouched: (fields: { [field: string]: boolean }, shouldValidate?: boolean) => Promise<void | FormikErrors>
touched
を命令的に設定します。これを呼び出すと、validateOnBlur
がtrue
(デフォルトで設定されています)に設定されている場合、検証が実行されます。2番目の引数としてfalse
を渡して、検証を明示的に防止/スキップすることもできます。
validateOnBlur
がtrue
に設定されていて、エラーがある場合は、返されたPromise
で解決されます。
setValues: (fields: React.SetStateAction<{ [field: string]: any }>, shouldValidate?: boolean) => Promise<void | FormikErrors<Values>>
values
を命令的に設定します。これを呼び出すと、validateOnChange
がtrue
(デフォルトで設定されています)に設定されている場合、検証が実行されます。2番目の引数としてfalse
を渡して、検証を明示的に防止/スキップすることもできます。
validateOnChange
がtrue
に設定されていて、エラーがある場合は、返されたPromise
で解決されます。
status?: any
他の方法では表現/保存できないフォームの状態を表すために使用できる最上位のステータスオブジェクト。これは、API応答をキャプチャして内部コンポーネントに渡すのに役立ちます。
status
は、setStatus
を呼び出すことによってのみ変更する必要があります。
touched: { [field: string]: boolean }
タッチされたフィールド。各キーは、タッチ/アクセスされたフィールドに対応しています。
values: { [field: string]: any }
フォームの値です。mapPropsToValues
(指定されている場合)の結果、またはラップされたコンポーネントに渡された関数ではないすべてのpropsの形になります。
validateForm: (values?: any) => Promise<FormikErrors<Values>>
指定された内容に応じて、validate
またはvalidateSchema
を命令的に呼び出します。検証対象の値をオプションで渡すことができ、これによりFormikの状態がそれに応じて変更されます。そうでない場合は、フォームの現在のvalues
が使用されます。
validateField: (field: string) => void
指定されたフィールドのvalidate
関数を命令的に呼び出すか、Yupのschema.validateAt
と提供されたトップレベルのvalidationSchema
propを使用してスキーマ検証を実行します。Formikは現在のフィールド値を使用します。
component?: React.ComponentType<FormikProps<Values>>
<Formik component={ContactForm} />;const ContactForm = ({handleSubmit,handleChange,handleBlur,values,errors,}) => (<form onSubmit={handleSubmit}><inputtype="text"onChange={handleChange}onBlur={handleBlur}value={values.name}name="name"/>{errors.name && <div>{errors.name}</div>}<button type="submit">Submit</button></form>);
警告: <Formik component>
は <Formik render>
よりも優先されるため、同じ <Formik>
内で両方を使用しないでください。
render: (props: FormikProps<Values>) => ReactNode
2.xで非推奨になりました。
<Formik render={props => <ContactForm {...props} />} /><Formikrender={({ handleSubmit, handleChange, handleBlur, values, errors }) => (<form onSubmit={handleSubmit}><inputtype="text"onChange={handleChange}onBlur={handleBlur}value={values.name}name="name"/>{errors.name &&<div>{errors.name}</div>}<button type="submit">Submit</button></form>)}/>
children?: React.ReactNode | (props: FormikProps<Values>) => ReactNode
<Formik children={props => <ContactForm {...props} />} />// or...<Formik>{({ handleSubmit, handleChange, handleBlur, values, errors }) => (<form onSubmit={handleSubmit}><inputtype="text"onChange={handleChange}onBlur={handleBlur}value={values.name}name="name"/>{errors.name &&<div>{errors.name}</div>}<button type="submit">Submit</button></form>)}</Formik>
enableReinitialize?: boolean
デフォルトはfalse
です。initialValues
が変更された場合に(深層的な等価性を使用して)、Formikがフォームをリセットするかどうかを制御します。
isInitialValid?: boolean
2.xで非推奨になりました。代わりにinitialErrors
を使用してください。
マウント前のisValid
propの初期値を制御します。関数を渡すこともできます。初期マウント時に送信ボタンとリセットボタンを有効/無効にしたい場合に便利です。
initialErrors?: FormikErrors<Values>
フォームの初期フィールドエラー。Formikはこれらの値をrenderメソッドコンポーネントでerrors
として利用できるようにします。
注意: initialErrors
は高階コンポーネントwithFormik
では利用できません。代わりにmapPropsToErrors
を使用してください。
initialStatus?: any
フォームの初期status
の任意の値。フォームがリセットされた場合、この値が復元されます。
注意: initialStatus
は高階コンポーネントwithFormik
では利用できません。代わりにmapPropsToStatus
を使用してください。
initialTouched?: FormikTouched<Values>
フォームの初期訪問済みフィールド。Formikはこれらの値をrenderメソッドコンポーネントでtouched
として利用できるようにします。
注意: initialTouched
は高階コンポーネントwithFormik
では利用できません。代わりにmapPropsToTouched
を使用してください。
initialValues: Values
フォームの初期フィールド値。Formikはこれらの値をrenderメソッドコンポーネントでvalues
として利用できるようにします。
フォームがデフォルトで空の場合でも、すべてのフィールドを初期値で初期化する必要があります。そうしないと、Reactは入力を非制御から制御に変更したというエラーをスローします。
注意: initialValues
は高階コンポーネントでは利用できません。代わりにmapPropsToValues
を使用してください。
onReset?: (values: Values, formikBag: FormikBag) => void
オプションのフォームリセットハンドラー。フォームのvalues
と「FormikBag」が渡されます。
onSubmit: (values: Values, formikBag: FormikBag) => void | Promise<any>
フォームの送信ハンドラー。フォームのvalues
と「FormikBag」が渡されます。「FormikBag」には、注入されたpropsとメソッドのサブセット(つまり、set<Thing>
で始まる名前のすべてのメソッド+ resetForm
)と、ラップされたコンポーネントに渡されたpropsを含むオブジェクトが含まれます。
注意: errors
、touched
、status
、およびすべてのイベントハンドラーはFormikBag
に含まれていません。
重要:
onSubmit
が非同期の場合、Formikは解決されると自動的にisSubmitting
をfalse
に設定します。つまり、formikBag.setSubmitting(false)
を手動で呼び出す必要はありません。ただし、onSubmit
関数が同期の場合は、自分でsetSubmitting(false)
を呼び出す必要があります。
validate?: (values: Values) => FormikErrors<Values> | Promise<any>
注意: 検証にはvalidationSchema
とYupを使用することをお勧めします。ただし、validate
は依存関係のない、フォームを検証するための簡単な方法です。
関数を使用してフォームのvalues
を検証します。この関数は、次のいずれかになります。
errors
オブジェクトを返します。// Synchronous validationconst validate = values => {const errors = {};if (!values.email) {errors.email = 'Required';} else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(values.email)) {errors.email = 'Invalid email address';}//...return errors;};
errors
を含むオブジェクトに解決されるPromiseを返します。// Async Validationconst sleep = ms => new Promise(resolve => setTimeout(resolve, ms));const validate = values => {return sleep(2000).then(() => {const errors = {};if (['admin', 'null', 'god'].includes(values.username)) {errors.username = 'Nice try';}// ...return errors;});};
validateOnBlur?: boolean
デフォルトはtrue
です。このオプションを使用して、blur
イベントで検証を実行します。より具体的には、handleBlur
、setFieldTouched
、またはsetTouched
のいずれかが呼び出された場合です。
validateOnChange?: boolean
デフォルトはtrue
です。このオプションを使用して、change
イベントとchange
関連のメソッドでFormikに検証を実行するように指示します。より具体的には、handleChange
、setFieldValue
、またはsetValues
のいずれかが呼び出された場合です。
validateOnMount?: boolean
デフォルトはfalse
です。このオプションを使用して、<Formik />
コンポーネントがマウントされたとき、および/またはinitialValues
が変更されたときにFormikに検証を実行するように指示します。
validationSchema?: Schema | (() => Schema)
YupスキーマまたはYupスキーマを返す関数。これは検証に使用されます。エラーはキーによって内部コンポーネントのerrors
にマップされます。キーはvalues
のキーと一致する必要があります。
最新のFormikニュース、記事、リソースをあなたの受信箱に送信します。