6

I have 6 form inputs that are using React-Datepicker. I need to use handleChange() to setState 6 times, but I do not understand how to get the name attribute dynamically from each form input because 'date' doesn't contain any other data when passing it through the function. I've tried passing 'name', but it doesn't work. The same goes for handleSelect()

this.state = {
  dateOne: new Date(),
  dateTwo: new Date(),
  dateThree: new Date(),
  dateFour: new Date(),
  dateFive: new Date(),
  dateSix: new Date()
}

handleChange(date) {
  this.setState({ ...this.state, ?????: date });
}

handleSelect(date) {
  this.setState({ ...this.state, ?????: date });
}

<form>
  <DatePicker
    name="dateOne"
    selected={this.state.dateOne}
    onSelect={this.handleSelect}
    onChange={this.handleChange}
  />
  <DatePicker
    name="dateTwo"
    selected={this.state.dateTwo}
    onSelect={this.handleSelect}
    onChange={this.handleChange}
  />
  <DatePicker
    name="dateThree"
    selected={this.state.dateThree}
    onSelect={this.handleSelect}
    onChange={this.handleChange}
  />
 <DatePicker
    name="dateFour"
    selected={this.state.dateFour}
    onSelect={this.handleSelect}
    onChange={this.handleChange}
  />
  <DatePicker
    name="dateFive"
    selected={this.state.dateFive}
    onSelect={this.handleSelect}
    onChange={this.handleChange}
  />
  <DatePicker
    name="dateSix"
    selected={this.state.dateSix}
    onSelect={this.handleSelect}
    onChange={this.handleChange}
  />
</form>

I've also tried this: https://github.com/Hacker0x01/react-datepicker/issues/242 without any luck.

Any help would be awesome!

Matthew
  • 57
  • 1
  • 5

3 Answers3

6

You can try like this:

<DatePicker
    name="dateOne"
    selected={this.state.dateOne}
    onSelect={this.handleSelect}
    onChange={(date)=>this.handleChange(date, 'dateOne')} //pass name as string
  />

handleChange(date, name) {
    this.setState({
        [name]: data
    });
}

So you pass the name as string, since you can't access target.name and then update state by name you receive [name]

Ertan Hasani
  • 1,675
  • 12
  • 27
0

Or you could do this

<DatePicker
    name="dateOne"
    selected={this.state.dateOne}
    onSelect={this.handleSelect}
    onChange={(date) => {
        date.name = 'dateOne';// add name to object to return
        this.handleChange(date);
    }
  />

handleChange(date) {
    this.setState({
        [date.name]: data
    });
}
-1

try this code

handleChange(date, flag) {
   if(flag===1)
   {
      this.setState({
         dateOne: date
      })
   }
   if(flag===2)
   {
      this.setState({
         dateTwo: date
      })
   }
   if(flag===3)
   {
      this.setState({
         dateThree: date
      })
   }
   if(flag===4)
   {
      this.setState({
         dateFour: date
      })
   }
   if(flag===5)
   {
      this.setState({
         dateFive: date
      })
   }
   if(flag===6)
   {
      this.setState({
         dateSix: date
      })
   }
}

......

<form>
<DatePicker
    name="dateOne"
    selected={this.state.dateOne}
    onSelect={this.handleSelect}
    onChange={(date)=>this.handleChange(date, 1)}
  />
  <DatePicker
    name="dateTwo"
    selected={this.state.dateTwo}
    onSelect={this.handleSelect}
    onChange={(date)=>this.handleChange(date, 2)}
  />
  <DatePicker
    name="dateThree"
    selected={this.state.dateThree}
    onSelect={this.handleSelect}
    onChange={(date)=>this.handleChange(date, 3)}
  />
 <DatePicker
    name="dateFour"
    selected={this.state.dateFour}
    onSelect={this.handleSelect}
    onChange={(date)=>this.handleChange(date, 4)}
  />
  <DatePicker
    name="dateFive"
    selected={this.state.dateFive}
    onSelect={this.handleSelect}
    onChange={(date)=>this.handleChange(date, 5)}
  />
  <DatePicker
    name="dateSix"
    selected={this.state.dateSix}
    onSelect={this.handleSelect}
    onChange={(date)=>this.handleChange(date, 6)}
  />
</form>
asif.ibtihaj
  • 361
  • 5
  • 14