Reputation: 2003
I have an input text like this
<input type="text" id="name" name="name" onChange={this.handleInputChange} value={this.state.name}/>
I changed this to make id dynamic inside a loop but I don't get how to concatenate the value to get it from state:
constructor(props) {
super(props);
this.state = {
value: ''
};
this.handleInputChange = this.handleInputChange.bind(this);
}
handleInputChange(event) {
const target = event.target;
const value = target.type === 'checkbox' ? target.checked : target.value;
const name = target.name;
this.setState({
[name]: value
});
}
{FIELDS.map((ele) => {
return <div>
<label className="field-label" htmlFor={ele.name}>{ele.value}</label>
<input type="text" style={typeText} id={ele.name} name={ele.name}
onChange={this.handleInputChange}
value={this.state.???????}
/>
</div>
})}
what should I put for value?
thanks
Upvotes: 0
Views: 1957
Reputation: 2922
state = {
value: ''
};
handleInputChange = event => {
const target = event.target;
const value = target.type === 'checkbox' ? target.checked : target.value;
const name = target.name;
this.setState({ [name]: value });
}
{FIELDS.map(ele => {
const { name, value } = ele;
return <div>
<label className="field-label" htmlFor={name}>{value}</label>
<input
type="text"
style={typeText}
id={name}
name={name}
onChange={this.handleInputChange}
value={this.state[name]}
/>
</div>
})}
Hope this helps.
Upvotes: 0
Reputation: 1336
try like this
const elements = [
{
name: 'name',
},
{
name: 'email',
},
{
name: 'password',
}
];
class Application extends React.Component {
state = {
};
handleInput = (name, value) => {
this.setState({[name]: value})
}
render(){
return(
<div>
{elements.map((ele, index) => (<div><label>{`${ele.name} : `}</label><input name={ele.name} value={this.state[name]} onChange={(e) => this.handleInput(ele.name, e.target.value)} /></div>))}
{JSON.stringify(this.state)}
</div>
);
}
}
ReactDOM.render(<Application />, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="app"></div>
Upvotes: 0
Reputation: 20765
I think you need this,
<input
type="text"
id={ele.name}
name={ele.name}
onChange={this.handleInputChange}
value={this.state[ele.name]} //This will take dynamic name
/>
Upvotes: 2