跳到主要内容

Arrays and Nested Objects

Formik has support for nested objects and arrays out of the box. These subjects are somewhat related because they both leverage the same syntax.

Nested Objects#

The name props in Formik can use lodash-like dot paths to reference nested Formik values. This means that you do not need to flatten out your form's values anymore.

import React from 'react';import { Formik, Form, Field } from 'formik';
export const NestedExample = () => (  <div>    <h1>Social Profiles</h1>    <Formik      initialValues={{        social: {          facebook: '',          twitter: '',        },      }}      onSubmit={values => {        // same shape as initial values        console.log(values);      }}    >      <Form>        <Field name="social.facebook" />        <Field name="social.twitter" />        <button type="submit">Submit</button>      </Form>    </Formik>  </div>);

Arrays#

Formik also has support for arrays and arrays of objects out of the box. Using lodash-like bracket syntax for name string you can quickly build fields for items in a list.

import React from 'react';import { Formik, Form, Field } from 'formik';
export const BasicArrayExample = () => (  <div>    <h1>Friends</h1>    <Formik      initialValues={{        friends: ['jared', 'ian'],      }}      onSubmit={values => {        // same shape as initial values        console.log(values);      }}    >      <Form>        <Field name="friends[0]" />        <Field name="friends[1]" />        <button type="submit">Submit</button>      </Form>    </Formik>  </div>);

For more information around manipulating (add/remove/etc) items in lists, see the API reference section on the <FieldArray> component.

Avoid nesting#

If you want to avoid this default behavior Formik also has support for it to have fields with dots.

import React from 'react';import { Formik, Form, Field } from 'formik';
export const NestedExample = () => (  <div>    <h1>Social Profiles</h1>    <Formik      initialValues={{        'owner.fullname': '',      }}      onSubmit={values => {        // same shape as initial values        console.log(values);      }}    >      <Form>        <Field name="['owner.fullname']" />        <button type="submit">Submit</button>      </Form>    </Formik>  </div>);