<Repeat />

The Repeat component is conceptually similar to the Section component except that it can be used to create what other libraries call "FieldArrays". A <Repeat /> uses a function as children and comes with a few handy helper methods.

Props

name: string

The name of the array this Repeat creates.

fallback?: T[]

Serves the same purpose as a Section's fallback prop. This is usually more useful when dealing with Repeats since it will allow you to call value.map() without worrying about the value being null or undefined.

children: ((value: T[], utils: ArrayHelpers<T>) => React.ReactNode)

The Repeat Component uses the function as a child pattern. The first argument is the value of this Repeat. The second argument is an object of array helper functions which provide some simple array manipulation functionality.

Array Helpers

PropDescription
push: (...items: T[]) => numberAppends new elements to the array, and returns the new length of the array.
pop: () => T \| undefinedRemoves the last element from the array and returns it.
shift: () => T \| undefinedRemoves the first element from the array and returns it.
unshift: (...items: T[]) => numberInserts new elements at the start of the array and returns the new length of the array.
insert: (index: number, ...items: T[]) => numberInserts new elements into the array at the specified index and returns the new length of the array.
swap: (index1: number, index2: number) => voidSwaps two elements at the specified indices.
remove: (index: number) => T \| undefinedRemoves an element from the array at the specified index.
setValue: (value: T[]) => voidSets the value of the array.

Example

interface Movie {
title: string
releaseDate: Date | null
rating: number
}
<Form>
<Repeat<Movie> name="movies" fallback={[]}>
{(arr, { push, remove, insert }) => {
return (
<>
{arr.map((item, i) => (
<Section<Movie> name={i}>
<Field<string> name="title" />
<Field<string> name="releaseDate" />
<Field<number> name="rating" />
<button onClick={() => remove(i)}>Remove</button>
</Section>
))}
<button onClick={() => push({ title: "", releaseDate: null, rating: 5 })}>Add</button>
</>
)
}}
</Repeat>
</Form>

Will produce...

{
movies: [
{
title: "",
releaseDate: null,
rating: 5
},
...
]
}