I have got a list of array of objects. I want to update the state. When I click on the 1st item of the array, it’s giving isTrue: false, when I click on the second array of items, isTrue is given as true. I want to get 1st item isTrue:true, when I click on the second array of items that give isTrue: true.
How can I do this?
import React, { Component } from "react";
import Child from "./child";
export default class App extends Component {
state = {
data: [
{ id: "2", name: "johan", org: "ORg" },
{ id: "1", name: "doe", org: "ORg" }
]
};
handleClick = e => {
let newData = this.state.data.map(obj => {
if (obj.id === e.target.id) {
return { ...obj, isTrue: !obj.isTrue };
} else {
return { ...obj, isTrue: false };
}
});
this.setState({ data: newData });
};
render() {
return (
<div>
{this.state.data.map(item => (
<Child data={item} key={item.id} handleClick={this.handleClick} />
))}
{/* <Child data={this.state.data} handleClick={this.handleClick} /> */}
</div>
);
}
}
Advertisement
Answer
You need more than one boolean in state to manage all of them. Update your data to be:
data: [
{ id: "name", name: "ss", org: "s", isTrue: true },
{ id: "nams", name: "ss", org: "s", isTrue: true }
]
Then add a name or id to your lis
<li id={item.id} onClick={this.handleClick}>{item.name}</li>
Then update your change handler to update the correct data object
handleClick = (e) => {
// Map over old data and return new objects so we dont mutate state
let newData = this.state.data.map(obj => {
// If the ID matches then update the value
if (obj.id == e.target.id) {
return {...obj, isTrue: !obj.isTrue}
}
// else return the same object
return obj;
});
// Update the state with the new object
this.setState({ data: newData });
};