Formik 源代码是用 TypeScript 编写的,因此你可以放心,Formik 的类型将始终是最新的。作为心理模型,Formik 的类型签名与 React Router 4 的 <Route>
非常相似。
¥The Formik source code is written in TypeScript, so you can rest easy that Formik's
types will always be up-to-date. As a mental model, Formik's type signatures are very
similar to React Router 4's <Route>
.
<Formik />
和 <Field />
)¥Render props (<Formik />
and <Field />
)
import * as React from 'react';import {Formik,FormikHelpers,FormikProps,Form,Field,FieldProps,} from 'formik';interface MyFormValues {firstName: string;}export const MyApp: React.FC<{}> = () => {const initialValues: MyFormValues = { firstName: '' };return (<div><h1>My Example</h1><FormikinitialValues={initialValues}onSubmit={(values, actions) => {console.log({ values, actions });alert(JSON.stringify(values, null, 2));actions.setSubmitting(false);}}><Form><label htmlFor="firstName">First Name</label><Field id="firstName" name="firstName" placeholder="First Name" /><button type="submit">Submit</button></Form></Formik></div>);};
withFormik()
import React from 'react';import * as Yup from 'yup';import { withFormik, FormikProps, FormikErrors, Form, Field } from 'formik';// Shape of form valuesinterface FormValues {email: string;password: string;}interface OtherProps {message: string;}// Aside: You may see InjectedFormikProps<OtherProps, FormValues> instead of what comes below in older code.. InjectedFormikProps was artifact of when Formik only exported a HoC. It is also less flexible as it MUST wrap all props (it passes them through).const InnerForm = (props: OtherProps & FormikProps<FormValues>) => {const { touched, errors, isSubmitting, message } = props;return (<Form><h1>{message}</h1><Field type="email" name="email" />{touched.email && errors.email && <div>{errors.email}</div>}<Field type="password" name="password" />{touched.password && errors.password && <div>{errors.password}</div>}<button type="submit" disabled={isSubmitting}>Submit</button></Form>);};// The type of props MyForm receivesinterface MyFormProps {initialEmail?: string;message: string; // if this passed all the way through you might do this or make a union type}// Wrap our form with the withFormik HoCconst MyForm = withFormik<MyFormProps, FormValues>({// Transform outer props into form valuesmapPropsToValues: props => {return {email: props.initialEmail || '',password: '',};},// Add a custom validation function (this can be async too!)validate: (values: FormValues) => {let errors: FormikErrors<FormValues> = {};if (!values.email) {errors.email = 'Required';} else if (!isValidEmail(values.email)) {errors.email = 'Invalid email address';}return errors;},handleSubmit: values => {// do submitting things},})(InnerForm);// Use <MyForm /> wherevsconst Basic = () => (<div><h1>My App</h1><p>This can be anywhere in your application</p><MyForm message="Sign up" /></div>);export default Basic;