Render array of inputs in react Render array of inputs in react reactjs reactjs

Render array of inputs in react


React requires you to have something unique for every element in the rendered array, it's called a key, and it's an attribute.

If you don't know what to assign to the key, just assign it the array's indexes:

this.props.doors.map((door, index) => (    <div key={index} className="door"></div>));

Here's the same solution applied to your problem:

return this.data.emailGroup.emails.map((email, index) => {    return (        <div key={index} className="input-group">            <input type="text"                   className="form-control"                   onChange={self.handleEmailListChange.bind(this, index)} value={email}/>        </div>    );});

Notice how I bound handleEmailListChange to receive the index of the modified email. If handleEmailListChange accepts an index, it can update the modified email within the state:

handleEmailListChange: function(index, event) {    var emails = this.state.emails.slice(); // Make a copy of the emails first.    emails[index] = event.target.value; // Update it with the modified email.    this.setState({emails: emails}); // Update the state.}


I believe what you're looking for is something like this:

MyPage = React.createClass({  mixins: [ReactMeteorData],  getMeteorData() {    // ...  },  render() {    const emails = this.data.emailGroup.emails.map((email) => {      return (        <div key={email} className="input-group">          <input type="text" className="form-control"                 onChange={this.handleEmailListChange} value={email} />          <div className="input-group-btn">            <button type="button"                    className="btn btn-default remove-email"><span              className="glyphicon glyphicon-remove" /></button>          </div>        </div>      );    });    return <div>      {emails}    </div>  }});

I changed self to this. Since you're using the ES6 arrow function, there's no need to assign self = this.


You should place your Array.map directly inside your render() function. Just take care that each array element is wrapped inside a parent element (<div> here) and must have a unique key={}

class ArrayMap extends React.Component{  //your functions  handleEmailChanged(key){    // Handle email  }  render(){    return(      <div>        {          this.data.emailGroup.emails.map((email) => {            <div key={email.key}>              <button onClick={this.handleEmailChanged.bind(this,email.key)}/>            </div>          });        }      </div>    );  }}