<Field />
は、Formik に入力項目を自動的に接続します。Formik の状態と一致させるために `name` 属性を使用します。<Field />
はデフォルトで HTML の <input />
要素になります。
<Field>
でレンダリングするには、いくつかの方法があります。
<Field as>
<Field children>
<Field component>
<Field render>
as
は、React コンポーネントまたはレンダリングする HTML 要素の名前のいずれかになります。Formik は、`name` プロパティによって指定されたフィールドの `onChange`、`onBlur`、`name`、`value` プロパティを (カスタム) コンポーネントに自動的に挿入します。
children
は、要素の配列 (例: <Field as="select">
の場合の <option>
) またはコールバック関数 (別名レンダープロップ) のいずれかになります。レンダープロップは、以下のオブジェクトを含んでいます。
field
: フィールドの `onChange`、`onBlur`、`name`、`value` を含むオブジェクト (FieldInputProps
を参照)form
: Formik バッグmeta
: フィールドに関するメタデータ (つまり、`value`、`touched`、`error`、`initialValue`) を含むオブジェクト (FieldMetaProps
を参照)component
は、React コンポーネントまたはレンダリングする HTML 要素の名前のいずれかになります。追加のプロップはすべて渡されます。
Formik 0.9 から 1.x では、
render
プロップもレンダリングに使用できました。2.x 以降では非推奨になりました。コードは<Field>
内に残っていますが、render
を使用するとコンソールに警告が表示されます。
import React from 'react';import { Field, Form, Formik, FormikProps } from 'formik';const MyInput = ({ field, form, ...props }) => {return <input {...field} {...props} />;};const Example = () => (<div><h1>My Form</h1><FormikinitialValues={{ email: '', color: 'red', firstName: '', lastName: '' }}onSubmit={(values, actions) => {setTimeout(() => {alert(JSON.stringify(values, null, 2));actions.setSubmitting(false);}, 1000);}}>{(props: FormikProps<any>) => (<Form><Field type="email" name="email" placeholder="Email" /><Field as="select" name="color"><option value="red">Red</option><option value="green">Green</option><option value="blue">Blue</option></Field><Field name="lastName">{({field, // { name, value, onChange, onBlur }form: { touched, errors }, // also values, setXXXX, handleXXXX, dirty, isValid, status, etc.meta,}) => (<div><input type="text" placeholder="Email" {...field} />{meta.touched && meta.error && (<div className="error">{meta.error}</div>)}</div>)}</Field><Field name="lastName" placeholder="Doe" component={MyInput} /><button type="submit">Submit</button></Form>)}</Formik></div>);
as
as?: string | React.ComponentType<FieldProps['field']>
React コンポーネントまたはレンダリングする HTML 要素の名前のいずれかです。つまり、以下のいずれかです。
input
select
textarea
カスタム React コンポーネントには、`onChange`、`onBlur`、`name`、`value` と、<Field>
に直接渡されたその他すべてのプロップが渡されます。
デフォルトは `'input'` です (そのため、デフォルトでは <input>
がレンダリングされます)
// Renders an HTML <input> by default<Field name="lastName" placeholder="Last Name"/>// Renders an HTML <select><Field name="color" as="select"><option value="red">Red</option><option value="green">Green</option><option value="blue">Blue</option></Field>// Renders a CustomInputComponent<Field name="firstName" as={CustomInputComponent} placeholder="First Name"/>const CustomInputComponent = (props) => (<input className="my-custom-input" type="text" {...props} />);
children
children?: React.ReactNode | ((props: FieldProps) => React.ReactNode)
JSX 要素またはコールバック関数のいずれかです。render
と同じです。
// Children can be JSX elements<Field name="color" as="select"><option value="red">Red</option><option value="green">Green</option><option value="blue">Blue</option></Field>// Or a callback function<Field name="firstName">{({ field, form, meta }) => (<div><input type="text" {...field} placeholder="First Name"/>{meta.touched &&meta.error && <div className="error">{meta.error}</div>}</div>)}</Field>
component
component?: string | React.ComponentType<FieldProps>
React コンポーネントまたはレンダリングする HTML 要素の名前のいずれかです。つまり、以下のいずれかです。
input
select
textarea
カスタム React コンポーネントには `FieldProps` が渡されます。これは、<Field render>
の `render` プロップのパラメータと同じであり、<Field>
に直接渡されたその他のプロップも含まれます。
デフォルトは `'input'` です (そのため、デフォルトでは <input>
がレンダリングされます)
// Renders an HTML <input> by default<Field name="lastName" placeholder="Last Name"/>// Renders an HTML <select><Field name="color" component="select"><option value="red">Red</option><option value="green">Green</option><option value="blue">Blue</option></Field>// Renders a CustomInputComponent<Field name="firstName" component={CustomInputComponent} placeholder="First Name"/>const CustomInputComponent = ({field, // { name, value, onChange, onBlur }form: { touched, errors }, // also values, setXXXX, handleXXXX, dirty, isValid, status, etc....props}) => (<div><input type="text" {...field} {...props} />{touched[field.name] &&errors[field.name] && <div className="error">{errors[field.name]}</div>}</div>);
innerRef
innerRef?: (el: React.HTMLElement<any> => void)
カスタムコンポーネントを使用しておらず、Field
によって作成された基になる DOM ノードにアクセスする必要がある場合 (例: `focus` を呼び出す場合)、代わりにコールバックを innerRef
プロップに渡します。
name
name: string
必須
Formik 状態でのフィールド名。ネストされたオブジェクトまたは配列にアクセスするには、`social.facebook` や `friends[0].firstName` のような lodash 風のドットパスを name に指定することもできます。
render
render?: (props: FieldProps) => React.ReactNode
2.x で非推奨になりました。代わりに `children` を使用してください。
1 つ以上の JSX 要素を返す関数です。
// Renders an HTML <input> and passes FieldProps field property<Fieldname="firstName"render={({ field /* { name, value, onChange, onBlur } */ }) => (<input {...field} type="text" placeholder="firstName" />)}/>// Renders an HTML <input> and disables it while form is submitting<Fieldname="lastName"render={({ field, form: { isSubmitting } }) => (<input {...field} disabled={isSubmitting} type="text" placeholder="lastName" />)}/>// Renders an HTML <input> with custom error <div> element<Fieldname="lastName"render={({ field, form: { touched, errors } }) => (<div><input {...field} type="text" placeholder="lastName" />{touched[field.name] &&errors[field.name] && <div className="error">{errors[field.name]}</div>}</div>)}/>
validate
validate?: (value: any) => undefined | string | Promise<any>
関数 を `validate` プロパティに渡すことで、独立したフィールドレベルのバリデーションを実行できます。この関数は、<Field>
の親 <Formik>
/ withFormik
で指定された `validateOnBlur` および `validateOnChange` の設定/プロパティを尊重します。この関数は、同期または非同期のいずれかになります。
同期: 無効な場合、エラーメッセージを含む `string` を返します。または `undefined` を返します。
非同期: エラーメッセージを含む `string` を解決する Promise を返します。これは Formik の `validate` と同様に機能しますが、`errors` オブジェクトを返す代わりに、`string` だけを返します。
import React from 'react';import { Formik, Form, Field } from 'formik';// Synchronous validation functionconst validate = value => {let errorMessage;if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(value)) {errorMessage = 'Invalid email address';}return errorMessage;};// Async validation functionconst sleep = ms => new Promise(resolve => setTimeout(resolve, ms));const validateAsync = value => {return sleep(2000).then(() => {if (['admin', 'null', 'god'].includes(value)) {return 'Nice try';}});};// example usageconst MyForm = () => (<FormikinitialValues={{ email: '', username: '' }}onSubmit={values => alert(JSON.stringify(values, null, 2))}>{({ errors, touched }) => (<Form><Field validate={validate} name="email" type="email" />{errors.email && touched.email ? <div>{errors.email}</div> : null}<Field validate={validateAsync} name="username" />{errors.username && touched.username ? (<div>{errors.username}</div>) : null}<button type="submit">Submit</button></Form>)}</Formik>);
注: i18n ライブラリを許可するために、`validate` の TypeScript 型定義はわずかに緩和されており、`Function` (例: `i18n('invalid')`) を返すことができます。
最新の Formik のニュース、記事、リソースをあなたの受信箱にお届けします。