id: withFormik title: withFormik()

custom_edit_url: https://github.com/jaredpalmer/formik/edit/master/docs/api/withFormik.md

创建一个更高阶的React组件类,它传递道具和表单处理程序(“FormikBag“)从您提供的选项派生的组件。

  1. import React from 'react';
  2. import { withFormik } from 'formik';
  3. const MyForm = props => {
  4. const {
  5. values,
  6. touched,
  7. errors,
  8. handleChange,
  9. handleBlur,
  10. handleSubmit,
  11. } = props;
  12. return (
  13. <form onSubmit={handleSubmit}>
  14. <input
  15. type="text"
  16. onChange={handleChange}
  17. onBlur={handleBlur}
  18. value={values.name}
  19. name="name"
  20. />
  21. {errors.name && touched.name && <div id="feedback">{errors.name}</div>}
  22. <button type="submit">Submit</button>
  23. </form>
  24. );
  25. };
  26. const MyEnhancedForm = withFormik({
  27. mapPropsToValues: () => ({ name: '' }),
  28. // Custom sync validation
  29. validate: values => {
  30. const errors = {};
  31. if (!values.name) {
  32. errors.name = 'Required';
  33. }
  34. return errors;
  35. },
  36. handleSubmit: (values, { setSubmitting }) => {
  37. setTimeout(() => {
  38. alert(JSON.stringify(values, null, 2));
  39. setSubmitting(false);
  40. }, 1000);
  41. },
  42. displayName: 'BasicForm',
  43. })(MyForm);

options

\


参考

options

displayName?: string

当您的内部表单组件是无状态功能组件时,您可以使用displayName选项为组件指定一个正确的名称,以便您可以更轻松地找到它反应DevTools。如果指定,您的包装表单将显示为Formik(displayName)。如果省略,它将显示为Formik(Component)。类组件不需要此选项(例如class XXXXX extends React.Component {..})。

enableReinitialize?: boolean

默认是false。如果包装的组件props更改(使用深度相等),则控制Formik是否应重置表单。

handleSubmit: (values: Values, formikBag: FormikBag) => void

表单提交处理程序。它通过你的表格values和“FormikBag”,其中包含一个包含一个子集的对象注入道具和方法(即名称以…开头的所有方法set<Thing>+resetForm)以及传递给包装组件的任何道具。

“FormikBag”:

  • props(传递给包装组件的道具)
  • resetForm
  • setErrors
  • setFieldError
  • setFieldTouched
  • setFieldValue
  • setStatus
  • setSubmitting
  • setTouched
  • setValues

注意:errorstouchedstatus并且所有事件处理程序都不包含在FormikBag

isInitialValid?: boolean | (props: Props) => boolean

默认是false。控制初始值isValid在安装之前的道具。您也可以传递一个功能。适用于要在初始安装时启用/禁用提交和重置按钮的情况。

mapPropsToValues?: (props: Props) => Values

如果指定了此选项,则Formik会将其结果转换为可更新的表单状态,并使这些值可用于新组件props.values。如果mapPropsToValues如果未指定,则Formik会将所有非函数的道具映射到内部组件props.values。也就是说,如果省略它,Formik将只通过props哪里typeof props[k] !== 'function',哪里k是一些关键。

即使您的表单没有从其父级接收任何道具,请使用mapPropsToValues初始化表单空状态。

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

注意:我建议使用validationSchema和Yup进行验证。然而,validate是一种无依赖,直接的方式来验证您的表单。

验证表单values有功能。这个功能可以是:

  1. 同步并返回errors宾语。
  1. // Synchronous validation
  2. const validate = (values, props) => {
  3. let errors = {};
  4. if (!values.email) {
  5. errors.email = 'Required';
  6. } else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(values.email)) {
  7. errors.email = 'Invalid email address';
  8. }
  9. //...
  10. return errors;
  11. };
  • 异步并返回一个错误的Promiseerrors宾语
  1. // Async Validation
  2. const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
  3. const validate = (values, props) => {
  4. return sleep(2000).then(() => {
  5. let errors = {};
  6. if (['admin', 'null', 'god'].includes(values.username)) {
  7. errors.username = 'Nice try';
  8. }
  9. // ...
  10. if (Object.keys(errors).length) {
  11. throw errors;
  12. }
  13. });
  14. };

validateOnBlur?: boolean

默认是true。使用此选项可以运行验证blur事件。更具体地说,当任何一个handleBlursetFieldTouched, 要么setTouched叫做。

validateOnChange?: boolean

默认是true。使用此选项可告知Formik运行验证change事件和change相关方法。更具体地说,当任何一个handleChangesetFieldValue, 要么setValues叫做。

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

Yup架构或者返回Yup架构的函数。这用于验证。错误按键映射到内部组件errors。它的键应该匹配values

注入的道具和方法

这些与道具相同<Formik render={props => ...} />