Render array of inputs in react

后端 未结 3 1984
孤独总比滥情好
孤独总比滥情好 2021-02-19 08:04

I have an array of emails (as a part of a bigger model). These are displayed in seperate rows witha remove button for each (the address itself can be updated in the input box d

相关标签:
3条回答
  • 2021-02-19 08:24

    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.

    0 讨论(0)
  • 2021-02-19 08:27

    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>
        );
      }
    }
    
    0 讨论(0)
  • 2021-02-19 08:38

    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.
    }
    
    0 讨论(0)
提交回复
热议问题