I'm using redux-form
to try to create a form that results in an array of objects, such as:
const formData = {
//...
rules: [
{
level: 1,
source: 'some source',
//...
}, {
level: 3,
source: 'another source'
//...
}
]
}
It seems like I should be able to next multiple FormSection
s with a FieldArray
component...but I can't make it work. Here's my current attempt:
const renderRules = ({ fields, meta: { error } }) => (
<div>
<Button
text="Add Rule"
onClick={e => {
e.preventDefault()
fields.push()
}}
/>
{fields.map((rule, index) => (
<FormSection name="rule"} key={index}>
<legend>Rule {index + 1}</legend>
<Field name="level" component={Select} label="Level">
<Option value={1}>Level 1</Option>
<Option value={2}>Level 2</Option>
<Option value={3}>Level 3</Option>
</Field>
<Field name="source" component={Input} label="Source" />
</FormSection>
))}
</div>
)
but this does not work :( as all the values get put under the rule
key, not as an object within the rules
array. Has anyone done this before? All the examples I can find of FieldArray
only use a single Field
element, but it's got to be possible to do something more complex. Has anyone done this before? Any help is appreciated! Thanks.
Figured it out & am posting for anyone else who comes up against this issue. Don't use a FormSection
& use the rule
argument when assigning the name of each field within the array, like so:
const renderRules = ({ fields, meta: { error } }) => (
<div>
<Button
text="Add Rule"
onClick={e => {
e.preventDefault()
fields.push()
}}
/>
{fields.map((rule, index) => (
<legend>Rule {index + 1}</legend>
<Field name={`${rule}.level`} component={Select} label="Level">
<Option value={1}>Level 1</Option>
<Option value={2}>Level 2</Option>
<Option value={3}>Level 3</Option>
</Field>
<Field name={`${rule}.source`} component={Input} label="Source" />
))}
</div>
)
This gives the Field
a name of rule[0].limit
or rule[0].source
& correctly nests the object within the array.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With