useField()

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>
<Formik
initialValues={{
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 元组(一个包含三个元素的数组),其中包含 FieldPropsFieldMetaPropsFieldHelperProps。它接受一个字段名称的字符串或一个对象作为参数。该对象必须至少包含一个 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 输入的类型(textnumber 等)
  • multiple?: boolean - 是否可以选择多个值。
  • value?: string- 仅适用于类型为 checkboxradio 的输入。提交表单时,复选框和单选按钮会使用提供的 value 提交。在MDN上了解更多信息。

FieldInputProps<Value>

一个包含以下内容的对象

  • name: string - 字段的名称
  • checked?: boolean - 输入是否被选中,这在将包含 nametype: 'checkbox'type: 'radio' 的对象传递给 useField 时定义。
  • onBlur: () => void - 模糊事件处理程序
  • onChange: (e: React.ChangeEvent<any>) => void - 更改事件处理程序
  • value: Value - 字段的值(从 values 中提取)或者,如果它是复选框或单选按钮输入,则可能是传递给 useFieldvalue
  • 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 - 用于更改字段错误值的函数

此页面是否有帮助?

订阅我们的新闻

最新的 Formik 新闻、文章和资源,发送到您的收件箱。

版权所有 © 2020 Formium, Inc. 保留所有权利。