It doesn't really matter what type of component is, either class or, functional. It completely depends on the implementation. Take a look at this code sandbox https://codesandbox.io/s/redux-form-field-arrays-example-wc9u6?file=/FieldArraysForm.js
import React from "react";
import { Field, FieldArray, reduxForm } from "redux-form";
import validate from "./validate";
const renderField = ({ input, label, type, meta: { touched, error } }) => (
<div>
<label>{label}</label>
<div>
<input {...input} type={type} placeholder={label} />
{touched && error && <span>{error}</span>}
</div>
</div>
);
const renderMembers = ({ fields, meta: { touched, error, submitFailed } }) => {
const handleInputChange = input => event => {
console.log("input From functional component", input);
};
return (
<ul>
<li>
<button type="button" onClick={() => fields.push({})}>
Add Member
</button>
{(touched || submitFailed) && error && <span>{error}</span>}
</li>
{fields.map((member, index) => (
<li key={index}>
<button
type="button"
title="Remove Member"
onClick={() => fields.remove(index)}
/>
<h4>Member #{index + 1}</h4>
<Field
name={`${member}.firstName`}
type="text"
component={renderField}
label="First Name"
onChange={handleInputChange("firstName")}
/>
<Field
name={`${member}.lastName`}
type="text"
component={renderField}
label="Last Name"
onChange={handleInputChange("lastName")}
/>
</li>
))}
</ul>
);
};
class RenderMembersUsingClass extends React.Component {
handleInputChange = input => () => {
console.log("input From class component", input);
};
render() {
const {
fields,
meta: { touched, error, submitFailed }
} = this.props;
return (
<ul>
<li>
<button type="button" onClick={() => fields.push({})}>
Add Member
</button>
{(touched || submitFailed) && error && <span>{error}</span>}
</li>
{fields.map((member, index) => (
<li key={index}>
<button
type="button"
title="Remove Member"
onClick={() => fields.remove(index)}
/>
<h4>Member #{index + 1}</h4>
<Field
name={`${member}.firstName`}
type="text"
component={renderField}
label="First Name"
onChange={this.handleInputChange("firstName")}
/>
<Field
name={`${member}.lastName`}
type="text"
component={renderField}
label="Last Name"
onChange={this.handleInputChange("lastName")}
/>
</li>
))}
</ul>
);
}
}
const FieldArraysForm = props => {
const { handleSubmit, pristine, reset, submitting } = props;
return (
<form onSubmit={handleSubmit}>
<Field
name="clubName"
type="text"
component={renderField}
label="Club Name"
/>
<FieldArray name="members" component={renderMembers} />
<FieldArray name="members" component={RenderMembersUsingClass} />
<div>
<button type="submit" disabled={submitting}>
Submit
</button>
<button type="button" disabled={pristine || submitting} onClick={reset}>
Clear Values
</button>
</div>
</form>
);
};
export default reduxForm({
form: "fieldArrays", // a unique identifier for this form
validate
})(FieldArraysForm);