<Formik />

<Formik> 是一個可以幫助您構建表單的組件。它使用由 React Motion 和 React Router 等函式庫推廣的渲染屬性模式。

範例

import React from 'react';
import { Formik } from 'formik';
const BasicExample = () => (
<div>
<h1>My Form</h1>
<Formik
initialValues={{ name: 'jared' }}
onSubmit={(values, actions) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
actions.setSubmitting(false);
}, 1000);
}}
>
{props => (
<form onSubmit={props.handleSubmit}>
<input
type="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 渲染方法和屬性

有兩種方法可以使用 <Formik /> 渲染內容

  • <Formik component>
  • <Formik children>
  • <Formik render> 在 2.x 版中已棄用

每個渲染方法都會傳遞相同的屬性

dirty: boolean

如果值與初始值深度不相等,則返回 true,否則返回 falsedirty 是一個唯讀的計算屬性,不應直接修改。

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,或者如果表單處於「原始」狀態(即非 dirty),則 isValid 將返回 isInitialValid 的結果。

isValidating: boolean

如果 Formik 正在提交期間或透過呼叫[validateForm]直接執行驗證,則返回 true,否則返回 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 以及 initialTouchedinitialStatusinitialErrors。這對於在進行更改後更改表單的初始狀態(即「基礎」)很有用。

// typescript usage
function 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 Blog
title: '',
image: '',
body: '',
},
// you can also set the other form states here
});
});
}}
>
// etc
</Formik>
);
}

如果省略 nextState,則 Formik 將狀態重置為原始初始狀態。後者適用於在 componentDidUpdateuseEffect 中呼叫 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 時觸發驗證(預設值為 true)。如果未指定,isTouched 預設為 true。您也可以透過傳遞第三個參數為 false 來明確地防止/跳過驗證。

如果 validateOnBlur 設定為 true 且存在錯誤,則錯誤將在返回的 Promise 中被解析。

submitForm: () => Promise

觸發表單提交。如果表單無效,promise 將會被拒絕。

submitCount: number

使用者嘗試提交表單的次數。在呼叫 handleSubmit 時增加,在呼叫 handleReset 後重置。 submitCount 是一個唯讀的計算屬性,不應直接修改。

setFieldValue: (field: string, value: React.SetStateAction<any>, shouldValidate?: boolean) => Promise<void | FormikErrors>

強制設定欄位的值。 field 應該與您想要更新的 values 的鍵值相符。這對於建立自定義的輸入欄位變更處理程序非常有用。呼叫此方法會在 validateOnChange 設定為 true 時觸發驗證(預設值為 true)。您也可以透過傳遞第三個參數為 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 時觸發驗證(預設值為 true)。您也可以透過傳遞第二個參數為 false 來明確地防止/跳過驗證。

如果 validateOnBlur 設定為 true 且存在錯誤,則錯誤將在返回的 Promise 中被解析。

setValues: (fields: React.SetStateAction<{ [field: string]: any }>, shouldValidate?: boolean) => Promise<void | FormikErrors<Values>>

強制設定 values。呼叫此方法會在 validateOnChange 設定為 true 時觸發驗證(預設值為 true)。您也可以透過傳遞第二個參數為 false 來明確地防止/跳過驗證。

如果 validateOnChange 設定為 true 且存在錯誤,則錯誤將在返回的 Promise 中被解析。

status?: any

一個最上層的狀態物件,您可以使用它來表示無法用其他方法表達/儲存的表單狀態。這對於擷取 API 回應並將其傳遞到您的內部組件非常有用。

status 只能透過呼叫 setStatus 來修改。

touched: { [field: string]: boolean }

已觸碰的欄位。每個鍵值對應一個已被觸碰/訪問的欄位。

values: { [field: string]: any }

您的表單的值。將具有 mapPropsToValues 的結果形狀(如果已指定),或是傳遞給您包裝組件的所有非函數屬性。

validateForm: (values?: any) => Promise<FormikErrors<Values>>

根據指定的內容強制呼叫您的 validatevalidateSchema。您可以選擇性地傳遞值以進行驗證,並據此修改 Formik 狀態,否則將使用表單的當前 values

validateField: (field: string) => void

如果為指定的欄位指定了欄位的 validate 函數,則強制呼叫它,或者使用 Yup 的 schema.validateAt 和提供的最上層 validationSchema 屬性來執行結構描述驗證。Formik 將使用當前的欄位值。

component?: React.ComponentType<FormikProps<Values>>

<Formik component={ContactForm} />;
const ContactForm = ({
handleSubmit,
handleChange,
handleBlur,
values,
errors,
}) => (
<form onSubmit={handleSubmit}>
<input
type="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} />} />
<Formik
render={({ handleSubmit, handleChange, handleBlur, values, errors }) => (
<form onSubmit={handleSubmit}>
<input
type="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}>
<input
type="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 屬性的初始值。您也可以傳遞一個函數。這在您想要在初始掛載時啟用/禁用提交和重置按鈕的情況下非常有用。

initialErrors?: FormikErrors<Values>

表單初始欄位錯誤,Formik 會將這些值以 errors 的形式提供給渲染方法組件。

注意:高階組件 withFormik 無法使用 initialErrors,請改用 mapPropsToErrors

initialStatus?: any

表單初始 status 的任意值。如果表單被重置,則會恢復此值。

注意:高階組件 withFormik 無法使用 initialStatus,請改用 mapPropsToStatus

initialTouched?: FormikTouched<Values>

表單初始已訪問的欄位,Formik 會將這些值以 touched 的形式提供給渲染方法組件。

注意:高階組件 withFormik 無法使用 initialTouched,請改用 mapPropsToTouched

initialValues: Values

表單的初始欄位值,Formik 會將這些值以 values 的形式提供給渲染方法組件。

即使您的表單預設為空,您也必須使用初始值初始化所有欄位,否則 React 會拋出錯誤,指出您已將輸入從非受控更改為受控。

注意:高階組件無法使用 initialValues,請改用 mapPropsToValues

onReset?: (values: Values, formikBag: FormikBag) => void

您的選用表單重置處理程序。它會傳入您的表單 values 和「FormikBag」。

onSubmit: (values: Values, formikBag: FormikBag) => void | Promise<any>

您的表單提交處理程序。它會傳入您的表單 values 和「FormikBag」,其中包含一個物件,該物件包含注入的屬性和方法的子集(即所有名稱以 set<Thing> 開頭的方法 + resetForm)以及傳遞給包裝組件的任何屬性。

注意:errorstouchedstatus 和所有事件處理程序*不*包含在 FormikBag 中。

重要事項:如果 onSubmit 是非同步的,則 Formik 會在解析後自動將 isSubmitting 設定為 false。這表示您*不需要*手動呼叫 formikBag.setSubmitting(false)。但是,如果您的 onSubmit 函式是同步的,則您需要自行呼叫 setSubmitting(false)

validate?: (values: Values) => FormikErrors<Values> | Promise<any>

注意:我建議使用 validationSchema 和 Yup 進行驗證。但是,validate 是一種不依賴任何函式庫、直接驗證表單的方法。

使用函式驗證表單的 values。此函式可以是:

  1. 同步並返回一個 errors 物件。
// Synchronous validation
const 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 Validation
const 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 事件上執行驗證。更具體地說,當呼叫 handleBlursetFieldTouchedsetTouched 時。

validateOnChange?: boolean

預設值為 true。使用此選項可告知 Formik 在 change 事件和與 change 相關的方法上執行驗證。更具體地說,當呼叫 handleChangesetFieldValuesetValues 時。

validateOnMount?: boolean

預設值為 false。使用此選項可告知 Formik 在掛載 <Formik /> 組件和/或 initialValues 變更時執行驗證。

validationSchema?: Schema | (() => Schema)

Yup 綱要 或返回 Yup 綱要的函式。這用於驗證。錯誤會透過鍵值對應到內部組件的 errors。其鍵值應與 values 的鍵值相符。

這個頁面有幫助嗎?

訂閱我們的電子報

最新的 Formik 新聞、文章和資源,將會寄送到您的收件匣。

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