Array field

The array field is used to create "Add one more" scenarios where you need one or multiple instances of a specific field schema.

You can only pass a single field to the array field — but this field can be an object field to create complex structures.

The label for the array field can optionally be defined in the second parameter, as an options object. It's also useful to define the itemLabel for each instance of the array, to give it a more meaningful label than the default Item 1, Item 2 etc.

Example usage

Simple

tags: fields.array(
  fields.text({ label: 'Tag' }),
  // Labelling options
  {
    label: 'Tag',
    itemLabel: props => props.value
  }
)

Complex

complexArray: fields.array(
  fields.object({
    name: fields.text({ label: 'Name' }),
    age: fields.integer({ label: 'Age' }),
    projects: fields.array(
      fields.relationship({
        label: 'Projects',
        collection: 'projects',
        validation: {
          isRequired: true,
        },
      }),
      {
        label: 'Projects',
        itemLabel: (props) => props.value ?? 'Select a project',
      }
    ),
  }),
  // Labelling options
  {
    label: 'Complex Array',
    itemLabel: (props) => props.fields.name.value,
  }
),

Slug field

The array field's slugField option is useful to replace indexes normally in file paths for images or documents etc.

It works similarly to the slugField option in Collections (including uniqueness validation), but with the difference that the slug is still written to the YAML/JSON.

For example, to change the slug from /authors/0/bio.mdoc to /authors/name/bio.mdoc you can do the following:

authors: fields.array(
  fields.object({
    name: fields.text({ label: 'Name' }),
    bio: fields.markdoc({
      label: 'Bio',
    }),
  }),
  {
    label: 'Authors',
    slugField: 'name',
    itemLabel: props => props.fields.name.value,
  }
),

Screencast walk-through

This segment of the Keystatic Mini-Course on YouTube may help understand how the array field works:


Type signature

Find the latest version of this field's type signature at: https://docsmill.dev/npm/@keystatic/core@latest#/.fields.array