useField 是一个 React hook,用于将 Formik 行为连接到任意字段组件。它为 Field 不合适的情况提供了最大的灵活性。有两种方法可以使用它。
import React from 'react';import { useField, Form, FormikProps, Formik } from 'formik';interface Values {firstName: string;lastName: string;email: string;}const MyTextField = ({ label, ...props }) => {const [field, meta] = useField(props);return (<><label>{label}<input {...field} {...props} /></label>{meta.touched && meta.error ? (<div className="error">{meta.error}</div>) : null}</>);};const Example = () => (<div><h1>My Form</h1><FormikinitialValues={{email: '',firstName: 'red',lastName: '',}}onSubmit={(values, actions) => {setTimeout(() => {alert(JSON.stringify(values, null, 2));actions.setSubmitting(false);}, 1000);}}>{(props: FormikProps<Values>) => (<Form><MyTextField name="firstName" type="text" label="First Name" /><MyTextField name="lastName" type="text" label="Last Name" /><MyTextField name="email" type="email" label="Email" /><button type="submit">Submit</button></Form>)}</Formik></div>);
useField<Value = any>(name: string | FieldHookConfig<Value>): [FieldInputProps<Value>, FieldMetaProps<Value>, FieldHelperProps]一个自定义的 React Hook,它返回一个 3 元组(一个包含三个元素的数组),其中包含 FieldProps、FieldMetaProps 和 FieldHelperProps。它接受一个字段名称的字符串或一个对象作为参数。该对象必须至少包含一个 name 键。此对象是您传递给 <Field> 的 props 的子集,并且 FieldProps 中的值和函数将完全模仿 <Field> 的行为。这很有用,并且通常是首选,因为它允许您在对象包含相关键/值(例如 type: 'checkbox'、multiple: true 等)时利用 Formik 的复选框、单选按钮和多选行为。
FieldMetaProps 包含关于字段的计算值,这些值可用于设置样式或以其他方式更改字段。FieldHelperProps 包含辅助函数,允许您以命令式方式更改字段的值。
import React from 'react';import { useField } from 'formik';function MyTextField(props) {// this will return field props for an <input />const [field, meta, helpers] = useField(props.name);return (<><input {...field} {...props} />{meta.error && meta.touched && <div>{meta.error}</div>}</>);}function MyInput(props) {// this will return field exactly like <Field>{({ field }) => ... }</Field>const [field, meta] = useField(props);return (<><input {...field} {...props} />{meta.error && meta.touched && <div>{meta.error}</div>}</>);}function MyOtherComponent(props) {// This isn't an input, so instead of using the values in 'field' directly,// we'll use 'meta' and 'helpers'.const [field, meta, helpers] = useField(props.name);const { value } = meta;const { setValue } = helpers;const isSelected = v => (v === value ? 'selected' : '');return (<div className="itemsPerPage"><button onClick={() => setValue(5)} className={isSelected(5)}>5</button><button onClick={() => setValue(10)} className={isSelected(10)}>10</button><button onClick={() => setValue(25)} className={isSelected(25)}>25</button></div>);}
FieldHookConfig<Value>此对象是您传递给 <Field> 的 props 的子集。它包含
name: string - 字段的名称validate?: (value: any) => undefined | string | Promise<any> - 请参阅<Field> 的文档type?: string - HTML 输入的类型(text、number 等)multiple?: boolean - 是否可以选择多个值。value?: string- 仅适用于类型为 checkbox 和 radio 的输入。提交表单时,复选框和单选按钮会使用提供的 value 提交。在MDN上了解更多信息。FieldInputProps<Value>一个包含以下内容的对象
name: string - 字段的名称checked?: boolean - 输入是否被选中,这仅在将包含 name、type: 'checkbox' 或 type: 'radio' 的对象传递给 useField 时定义。onBlur: () => void - 模糊事件处理程序onChange: (e: React.ChangeEvent<any>) => void - 更改事件处理程序value: Value - 字段的值(从 values 中提取)或者,如果它是复选框或单选按钮输入,则可能是传递给 useField 的 value。multiple?: boolean - 是否可以选择多个值。这仅在将包含 multiple: true 的对象传递给 useField 时定义。FieldMetaProps<Value>一个包含与字段相关的计算元数据。更具体地说,
error?: string - 字段的错误消息(从 errors 中提取)initialError?: string - 如果字段存在于 initialErrors 中,则为字段的初始错误(从 initialErrors 中提取)initialTouched: boolean - 如果字段存在于 initialTouched 中,则为字段的初始值(从 initialTouched 中提取)initialValue?: Value - 如果字段在 initialValues 中被赋予值,则为字段的初始值(从 initialValues 中提取)touched: boolean - 字段是否已被访问(从 touched 中提取)value: any - 字段的值(从 values 中提取)FieldHelperProps一个包含辅助函数的对象,您可以使用这些函数以命令式方式更改相关字段的值、错误值或已触碰状态。这对于需要直接更改字段状态的组件很有用,而无需触发更改或模糊事件。
setValue(value: any, shouldValidate?: boolean): Promise<void | FormikErrors> - 用于更改字段值的函数。调用此函数将触发验证运行,前提是 validateOnChange 设置为 true(默认情况下为 true)。您还可以通过将第二个参数传递为 false 来显式防止/跳过验证。如果 validateOnChange 设置为 true 并且存在错误,则它们将在返回的 Promise 中解析。
setTouched(value: boolean, shouldValidate?: boolean): void - 用于更改字段已触碰状态的函数。调用此函数将触发验证运行,前提是 validateOnBlur 设置为 true(默认情况下为 true)。您还可以通过将第二个参数传递为 false 来显式防止/跳过验证。如果 validateOnBlur 设置为 true 并且存在错误,则它们将在返回的 Promise 中解析。
setError(value: any): void - 用于更改字段错误值的函数