first, you have to set the state same as below
and to add a new row you can use spread operator
const newState = [...this.state.inputs, newRow];
I rewrite your code so you can look at it and try to understand it
class App extends React.Component {
state = {
inputs: [
{
firstname: 'Ibrahim',
lastname: 'Doe'
},
{
firstname: 'Mohammed',
lastname: 'Jon'
}
],
inputFirstname: '',
inputLastame: ''
};
handleOnChange = e => {
this.setState({ [e.target.name]: e.target.value });
};
addRow = e => {
e.preventDefault();
const newRow = {
firstname: this.state.inputFirstname,
lastname: this.state.inputLastame
};
const newState = [...this.state.inputs, newRow];
this.setState({
inputs: newState,
inputFirstname: '',
inputLastame: ''
});
};
render() {
return (
<form>
{this.state.inputs.map(input => (
<div key={input.firstname}>
<input placeholder={input.firstname} type="text" />
<input placeholder={input.lastname} type="text" />
</div>
))}
<input
onChange={this.handleOnChange}
placeholder="firstname"
type="text"
name="inputFirstname"
value={this.state.inputFirstname}
/>
<input
onChange={this.handleOnChange}
placeholder="lastname"
type="text"
name="inputLastame"
value={this.state.inputLastame}
/>
<button onClick={this.addRow}>add row</button>
</form>
);
}
}
const rootElement = document.getElementById('root');
ReactDOM.render(<App />, rootElement);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id='root'></div>