ReactIS: значение по умолчанию в выпадающем списке выбора неверно выбрано

#javascript #reactjs #select

#javascript #reactjs #выберите

Вопрос:

У меня есть выпадающий список выбора, я хочу установить значение по умолчанию, чтобы оно было удобным для пользователя. Но что произойдет, если пользователь не изменит выбор на что-то другое, я не получу фактическое значение. Должно быть, я сделал что-то не так, но что именно?

Вот мой код: в конструкторе

 constructor(props) {
   super(props);
   this.state = {};
   this.state = {
      …
      reward: this.props.milestone.reward || "",
      …
   };
this.onMilestoneRewardChanged = this.onMilestoneRewardChanged.bind(this);


render(){
<td className="input-group-sm col-sm-1">
   <select className="form-control"
         defaultValue={combinedRewards[0]}
         value={this.state.reward}
         onChange={(e) => this.onRewardChanged(milestoneIdx, e)}>
      {combinedRewards.map(this.renderRewardIDs)}
   </select>
</td>
}

renderRewardIDs(reward, idx) {
   return (
      <option key={idx} value={reward.id}>{reward.id}</option>
   );
}

onRewardChanged(Idx, event){
   this.setState({reward: event.target.value});
   …
}
  

таким образом, первый элемент в списке отображается как значение по умолчанию, но если пользователь думает, что оно уже выбрано, и не меняет его на что-то другое, поле вознаграждения в сохраненных данных остается пустым. Почему?

Ответ №1:

Я считаю, что это происходит из-за вашего начального состояния reward: this.props.milestone.reward || "" .

Когда вы сохраняете его, значение if this.props.milestone.reward не определено, чем значение будет "" , если взаимодействие с пользователем не происходило.

Также неясно, что это за значение combinedRewards[0] . Если вы установите значение defaultValue combinedRewards[0] равным, вам, вероятно, следует установить начальное состояние на то же самое.

Может быть, что-то вроде этого?

 constructor(props) {
   super(props);
   this.state = {};
   this.state = {
      …
      reward: this.props.milestone.reward || combinedRewards[0], // updated
      …
   };
this.onMilestoneRewardChanged = this.onMilestoneRewardChanged.bind(this);


render(){
<td className="input-group-sm col-sm-1">
   <select className="form-control"
         defaultValue={this.state.reward} // updated
         value={this.state.reward}
         onChange={(e) => this.onRewardChanged(milestoneIdx, e)}>
      {combinedRewards.map(this.renderRewardIDs)}
   </select>
</td>
}