<Field />

<Field /> は、Formik に入力項目を自動的に接続します。Formik の状態と一致させるために `name` 属性を使用します。<Field /> はデフォルトで HTML の <input /> 要素になります。

レンダリング

<Field> でレンダリングするには、いくつかの方法があります。

  • <Field as>
  • <Field children>
  • <Field component>
  • <Field render> 2.x で非推奨になりました。これを使用すると警告ログが出力されます

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>
<Formik
initialValues={{ 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
  • 有効な HTML 要素名
  • カスタム React コンポーネント

カスタム 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 コンポーネント

カスタム 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
<Field
name="firstName"
render={({ field /* { name, value, onChange, onBlur } */ }) => (
<input {...field} type="text" placeholder="firstName" />
)}
/>
// Renders an HTML <input> and disables it while form is submitting
<Field
name="lastName"
render={({ field, form: { isSubmitting } }) => (
<input {...field} disabled={isSubmitting} type="text" placeholder="lastName" />
)}
/>
// Renders an HTML <input> with custom error <div> element
<Field
name="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 function
const 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 function
const 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 usage
const MyForm = () => (
<Formik
initialValues={{ 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 のニュース、記事、リソースをあなたの受信箱にお届けします。

Copyright © 2020 Formium, Inc. All rights reserved.