Здесь вы используете концепцию Array of Object. Изменение значений в массиве объектов немного сложнее. Если вы это хорошо понимаете, то это хорошо, иначе я предлагаю вам прочитать об этом. :)
Предложение - Как управлять состоянием реагирования с массивами
Код ниже - решение вашей проблемы.
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
class App extends Component {
state = {
data: [
{ Name: "rommy", Ages: 24, Occupation: "coder", inputVal: "" },
{ Name: "andi", Ages: 43, Occupation: "Teacher", inputVal: "" },
{ Name: "susilo", Ages: 42, Occupation: "Mobile Dev", inputVal: "" }
]
};
renderBiodata = () => {
let { data } = this.state;
return data.map((val, i) => {
return (
<div style={{ border: "1px solid black" }}>
<div>{val.Name}</div>
<div>{val.Ages}</div>
<div>{val.Occupation}</div>
<div>
<input
type="text"
value={val.inputVal}
onChange={e => {
let _val = Object.assign({}, val);
_val.inputVal = e.target.value;
this.setState((state, prop) => ({
data: state.data.map((x, j) => {
if (i === j) return _val;
return x;
})
}));
}}
/>
</div>
<div>
<input
type="button"
value="Change Name"
onClick={() => {
let _val = Object.assign({}, val);
_val.Name = val.inputVal;
this.setState((state, prop) => ({
data: state.data.map((x, j) => {
if (i === j) return _val;
return x;
})
}));
}}
/>
</div>
<div />
<div />
</div>
);
});
};
render() {
return (
<div style={{ display: "flex", justifyContent: "center" }}>
{this.renderBiodata()}
</div>
);
}
}
export default App;