Есть несколько способов, которыми вы могли бы достичь этого - один из них - отслеживать дополнительное состояние для каждой области учащегося, чтобы показать выделение таким образом.Один из возможных вариантов - использовать шаблон, подобный вашему текущему решению, с помощью следующего:
render() {
return (<table className="table-data">
<tbody>
<tr>
<th>Name</th>
<th>Age</th>
<th>Class</th>
<th>Section</th>
</tr>
{ this.state.students.map((item,key) => {
const editField = (value, index) => {
// Clone students data before mutation
const students = this.state.students.map(item => ({ ...item }))
// Update field by index of current student
students[key][index] = value
// Extend state for student to tract editing history per field
students[key].edited = students[key].edited || []
students[key].edited[index] = true
// Trigger re-render
this.setState({ students })
}
// Returns true if the field by index has been edited. This is used for styling the td
const isEdited = (index) => {
const students = this.state.students.map(item => ({ ...item }))
return (students[key].edited && students[key].edited[index] === true)
}
// Apply 'editing' class to the cell if it has been previously edited
return (
<tr key={key} className={ item.editing ? 'editing' : '' } onClick={()=> {
// Clone students data before mutation
const students = this.state.students.map(i => ({ ...i, editing : item.editing && i===item }))
// Toggle editing flag of this current student (ie table row)
students[key].editing = true;
// Trigger re-render
this.setState({
clientIsEditing:true, // This might not be needed ?
students
})
}
}>
<td className={ isEdited(1) ? 'edited' : '' } >{ item.editing ? <input value={item[1]} onChange={ e => editField(e.target.value, 1) } /> : <span>{item[1]}</span> }</td>
<td className={ isEdited(2) ? 'edited' : '' } >{ item.editing ? <input value={item[2]} onChange={ e => editField(e.target.value, 2) } /> : <span>{item[2]}</span> }</td>
<td className={ isEdited(3) ? 'edited' : '' } >{ item.editing ? <input value={item[3]} onChange={ e => editField(e.target.value, 3) } /> : <span>{item[3]}</span> }</td>
<td className={ isEdited(4) ? 'edited' : '' } >{ item.editing ? <input value={item[4]} onChange={ e => editField(e.target.value, 4) } /> : <span>{item[4]}</span> }</td>
</tr> )
})
}
</tbody>
</table>)
}
Чтобы завершить это, вам просто нужно добавить селектор CSS, подобный этому:
https://jsfiddle.net/7uspaot5/
Для рабочей демонстрации, , пожалуйста, посмотрите это jsFiddle - надеюсь, это поможет!