Reputation: 958
I have a list of Objects in Array, which contain user values. I want to change a specific object depending on user choice. To be more specific, I have a Table, for each user, there is a property ischecked which is false on default. I want that when a user clicks on a checkbox, isChecked property changes to true.
Here is my Function which displays the table data.
// Display Table Data
renderTableData = () => {
return this.state.students.map((student, index) => {
const { isChecked, name, age, email } = student; //destructuring
return (
<tr className={classes.tableRow} key={index}>
<td className={classes.tableDataSpecial}>
<div className={classes.content}>
{" "}
<input
type="checkbox"
checked={isChecked}
onChange={this.toggleCheckHandler}
/>
</div>
</td>
<td className={classes.tableData}>{name}</td>
<td className={classes.tableData}>{age}</td>
<td className={classes.tableData}>{email}</td>
</tr>
);
});
};
Here is my State
state = {
students: [
{ isChecked: false, name: "Wasif", age: 21, email: "[email protected]" },
{ isChecked: false, name: "Ali", age: 19, email: "[email protected]" },
{ isChecked: false, name: "Saad", age: 16, email: "[email protected]" },
{ isChecked: false, name: "Asad", age: 25, email: "[email protected]" }
]
};
and here is my toggleCheckHandler function
toggleCheckHandler = e => {
console.log(e.target);
};
e.target gives me DOM content. So how to target that specific object.
For Example, I want to set isChecked of Wasif to true, how do I do that?
Upvotes: 0
Views: 42
Reputation: 98
You could make use of the index
parameter of your callback function. This could look something like:
// Display Table Data
renderTableData = () => {
return this.state.students.map((student, index) => {
const { isChecked, name, age, email } = student; //destructuring
return (
<tr className={classes.tableRow} key={index}>
<td className={classes.tableDataSpecial}>
<div className={classes.content}>
{" "}
<input
type="checkbox"
checked={isChecked}
onChange={() => this.toggleCheckHandler(index)}
/>
</div>
</td>
<td className={classes.tableData}>{name}</td>
<td className={classes.tableData}>{age}</td>
<td className={classes.tableData}>{email}</td>
</tr>
);
});
};
toggleCheckHandler = (index) => {
const students = this.state.students;
students[index].isChecked = !students[index].isChecked;
this.setState({
students: students
});
};
Upvotes: 2
Reputation: 1102
You can also pass any data related to specific student (whole 'student' object, email, or id of this student). Something like this:
const { isChecked, name, age, email } = student; //destructuring
return (
...
<input
type="checkbox"
checked={isChecked}
onChange={()=>this.toggleCheckHandler(email)}
/>
...
)
toggleCheckHandler = email => {
console.log(email); // or id
};
Then you can easily find an object in array by email (or id).
Upvotes: 0