I have data in this form:
books = [{
id: 1,
name: "book-1",
audiences: [
{
audienceId: 1,
name: "Cat A",
critics: [
{ id: 5, name: "Jack" },
{ id: 45, name: "Mike" },
{ id: 32, name: "Amanda" }
],
readers: [
{ id: 11, fullName: "Mike Ross" },
{ id: 76, fullName: "Natalie J" },
{ id: 34, fullName: "Harvey Spectre" }
]
}]
The forms are nested. For each book, there are critics and readers, and would render each form depending on audienceId value
<div className="App">
{books.map((book, index) => (
<div key={book.id}>
<h1>Books {index + 1}</h1>
{book.audiences.map((au) => (
<div key={au.audienceId}>
<h3>{au.name}</h3>
<Recap
audiences={au}
shouldRenderCritics={au.audienceId === 2}
shouldRenderReaders={au.audienceId === 1}
criticsChildren={renderByAudience(au.audienceId)}
readersChildren={renderByAudience(au.audienceId)}
/>
</div>
))}
</div>
))}
</div>
This is form to render depending on audienceId
return (
<div className="root">
<div>
{props.audienceId === 1 && (
<A
setReader={setReader(readerIdx)}
reader={selectedReader as IreaderState}
/>
)}
</div>
<div>
{props.audienceId === 2 && (
<B
setCritic={setCritic(criticIdx)}
critic={selectedCritic as IcriticState}
/>
)}
</div>
</div>
);
Finally, for each reader/critic, there is a form to input.
export default function A(props: Aprops) {
const handleChange = (
event: ChangeEvent<{ value: number | string; name: string }>
) => {
const { name, value } = event.target;
const r = { ...props.reader };
r[name] = value;
props.setReader(r);
};
return (
<div>
<TextField
name="rate"
type="number"
value={get(props.reader, "rate", "")}
onChange={handleChange}
/>
<TextField
name="feedback"
value={get(props.reader, "feedback", "")}
onChange={handleChange}
/>
</div>
);
The issue
Each time I fill in a field of critic/reader, it set state for that object but also set the initial state for the rest of objects. it only set state of the form in which in focus and doesnt keep the values of other forms
I don't know what causes the problem.
Here is a sandbox reproducing the issue https://codesandbox.io/s/project-u0m5n