id: typescript title: TypeScript

custom_edit_url: https://github.com/jaredpalmer/formik/edit/master/docs/guides/typescript.md

TypeScript Types

Formik 源代码是用 TypeScript 编写的,因此您放心, Formik 的类型始终是最新的。作为思维模型,Formik 的类型签名与 React Router 4 的<Route>非常相似。

渲染 props(<Formik /><Field />

  1. import * as React from 'react';
  2. import {Formik, FormikProps, Form, Field, FieldProps} from 'formik';
  3. interface MyFormValues {
  4. firstName: string;
  5. }
  6. export const MyApp: React.SFC<{}> = () => {
  7. return (
  8. <div>
  9. <h1>My Example</h1>
  10. <Formik
  11. initialValues={{firstName: ''}}
  12. onSubmit={(values: MyFormValues) => alert(JSON.stringify(values))}
  13. render={(formikBag: FormikProps<MyFormValues>) => (
  14. <Form>
  15. <Field
  16. name="firstName"
  17. render={({field, form}: FieldProps<MyFormValues>) => (
  18. <div>
  19. <input type="text" {...field} placeholder="First Name" />
  20. {form.touched.firstName &&
  21. form.errors.firstName &&
  22. form.errors.firstName}
  23. </div>
  24. )}
  25. />
  26. </Form>
  27. )}
  28. />
  29. </div>
  30. );
  31. };

withFormik()

  1. import React from 'react';
  2. import * as Yup from 'yup';
  3. import {withFormik, FormikProps, FormikErrors, Form, Field} from 'formik';
  4. // form 值的样子
  5. interface FormValues {
  6. email: string;
  7. password: string;
  8. }
  9. interface OtherProps {
  10. message: string;
  11. }
  12. // 旁白: 你可以看到 InjectedFormikProps<OtherProps, FormValues> 替代了 旧代码的下面.. 当 Formik 仅导出一个 HoC,InjectedFormikProps 是工件, 这也少了些灵活性 因它 必须包裹所有 props (传递所有).
  13. const InnerForm = (props: OtherProps & FormikProps<FormValues>) => {
  14. const {touched, errors, isSubmitting, message} = props;
  15. return (
  16. <Form>
  17. <h1>{message}</h1>
  18. <Field type="email" name="email" />
  19. {touched.email && errors.email && <div>{errors.email}</div>}
  20. <Field type="password" name="password" />
  21. {touched.password && errors.password && <div>{errors.password}</div>}
  22. <button type="submit" disabled={isSubmitting}>
  23. Submit
  24. </button>
  25. </Form>
  26. );
  27. };
  28. // MyForm接收的 props 类型
  29. interface MyFormProps {
  30. initialEmail?: string;
  31. message: string; // 如果全传递,则可以执行此操作或生成联合类型
  32. }
  33. // 使用 HoC withFormik 包装我们的表单
  34. const MyForm = withFormik<MyFormProps, FormValues>({
  35. // 将外部 props 转换为形式值
  36. mapPropsToValues: props => {
  37. return {
  38. email: props.initialEmail || '',
  39. password: ''
  40. };
  41. },
  42. // 添加自定义验证函数(这也可以是异步的!)
  43. validate: (values: FormValues) => {
  44. let errors: FormikErrors = {};
  45. if (!values.email) {
  46. errors.email = 'Required';
  47. } else if (!isValidEmail(values.email)) {
  48. errors.email = 'Invalid email address';
  49. }
  50. return errors;
  51. },
  52. handleSubmit: values => {
  53. // 做提交的事情
  54. }
  55. })(InnerForm);
  56. // 其中使用<MyForm />
  57. const Basic = () => (
  58. <div>
  59. <h1>My App</h1>
  60. <p>This can be anywhere in your application</p>
  61. <MyForm message="Sign up" />
  62. </div>
  63. );
  64. export default Basic;