Предупреждение. Используйте реквизиты 'defaultValue' или 'value' для <select> вместо установки 'selected' on <option>

СЦЕНАРИЙ У пользователя есть выпадающий список, и он выбирает опцию. Я хочу отобразить этот раскрывающийся список и сделать этот параметр значением по умолчанию, которое было выбрано этим пользователем в последний раз.

Я использую атрибут selected для опции, но React выдает предупреждение, в котором предлагается использовать значение по умолчанию для select.

Например,

render: function() {
    let option_id = [0, 1];
    let options = [{name: 'a'}, {name: 'b'}];
    let selectedOptionId = 0

    return (
      <select defaultValue={selectedOptionId}>
        {option_id.map(id =>
        <option key={id} value={id}>{options[id].name}</option>
        )}
      </select>
    )
  }
});

Проблема в том, что я не знаю selectedOptionId, поскольку выбранный параметр может быть любым. Как мне найти defaultValue?

Ответы

Ответ 1

React использует value вместо selected для согласованности между компонентами формы. Вы можете использовать defaultValue для установки начального значения. Если вы контролируете значение, вы также должны установить value. Если нет, не устанавливайте value и вместо этого обрабатывайте событие onChange чтобы реагировать на действие пользователя.

Обратите внимание, что value и defaultValue должны соответствовать value параметра.

Ответ 2

В случае, если вы хотите установить местозаполнитель и не иметь значения по умолчанию, вы можете использовать эту опцию.

      <select defaultValue={'DEFAULT'} >
        <option value="DEFAULT" disabled>Choose a salutation ...</option>
        <option value="1">Mr</option>
        <option value="2">Mrs</option>
        <option value="3">Ms</option>
        <option value="4">Miss</option>
        <option value="5">Dr</option>
      </select>

Здесь пользователь вынужден выбрать опцию!

EDIT

Если это контролируемый компонент

К сожалению, в этом случае вам придется использовать и defaultValue, и значение, немного нарушающее React. Это связано с тем, что реагирование по семантике не позволяет устанавливать отключенное значение как активное.

 function TheSelectComponent(props){
     let currentValue = props.curentValue || "DEFAULT";
     return(
      <select value={currentValue} defaultValue={'DEFAULT'} onChange={props.onChange}>
        <option value="DEFAULT" disabled>Choose a salutation ...</option>
        <option value="1">Mr</option>
        <option value="2">Mrs</option>
        <option value="3">Ms</option>
        <option value="4">Miss</option>
        <option value="5">Dr</option>
      </select>
    )
}

Ответ 3

Вы можете сделать, чтобы selected атрибут <select> был атрибутом this.state, установленным в конструкторе. Таким образом, начальное значение, которое вы установили (по умолчанию), и когда выпадающие изменения вам нужно изменить ваше состояние.

constructor(){
  this.state = {
    selectedId: selectedOptionId
  }
}

dropdownChanged(e){
  this.setState({selectedId: e.target.value});
}

render(){
  return(
    <select value={this.selectedId} onChange={this.dropdownChanged.bind(this)}>
      {option_id.map(id =>
        <option key={id} value={id}>{options[id].name}</option>
      )}
    </select>
  );
}