React multi select не может выбрать отрицательное значение - PullRequest
0 голосов
/ 21 ноября 2018

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

 class FlavorForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: '1'};

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({value: event.target.value});
  }

  handleSubmit(event) {
    alert('Your favorite flavor is: ' + this.state.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Pick your favorite flavor:
          <select value={this.state.value} onChange={this.handleChange} multiple>
            <option value="-1">Grapefruit</option>
            <option value="0">Lime</option>
            <option value="1">Coconut</option>
            <option value="2">Mango</option>
          </select>
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

ReactDOM.render(
  <FlavorForm />,
  document.getElementById('root')
);

Пожалуйста, помогите, как выбрать -1 с множественным выбором реакции.

Демо

Ответы [ 4 ]

0 голосов
/ 21 ноября 2018

Использовать массив для значения, если множественное значение равно true, на основе документации .Для поведения с несколькими выборками используйте параметры, описанные в этом сообщении .

class FlavorForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ['1']};

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange = ({target}) => {
    this.setState(prevState => ({
      value: [].filter.call(target.options, o => o.selected).map(o => o.value)
    }));
  }

  handleSubmit(event) {
    alert('Your favorite flavor is: ' + this.state.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Pick your favorite flavor:
          <select value={this.state.value} onChange={this.handleChange} multiple>
            <option value="-1">Grapefruit</option>
            <option value="0">Lime</option>
            <option value="1">Coconut</option>
            <option value="2">Mango</option>
          </select>
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

ReactDOM.render(
  <FlavorForm />,
  document.getElementById('root')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
0 голосов
/ 21 ноября 2018

Удалить атрибут значения из элемента select, там он недопустим.

<select onChange={this.handleChange} multiple>...</select>
0 голосов
/ 21 ноября 2018

Вам нужно сохранить свойство values ​​в состоянии в виде массива, то есть:

this.state = { 
  values: []
}

А затем измените handleChange на следующее:

handleChange(event) {
    let choices = event.target.selectedOptions;
    let final = [];
    for(let i=0; i<choices.length; i++) {
      final.push(choices[i].value);
    }
    this.setState({ value: final });
  }

И оно должно работать.

Вот ссылка на рабочую версию: https://codesandbox.io/s/p3705q0zm

Ура!

0 голосов
/ 21 ноября 2018

Я заметил, что моя консоль регистрирует следующую ошибку

Предупреждение: поставляемая в value опора должна быть массивом, если multiple - true.

Я позволил себе исправить это, и по совпадению выбор -1 начал работать:

class FlavorForm extends React.Component {
  constructor (props) {
    super(props)
    this.state = { values: [] }

    this.handleChange = this.handleChange.bind(this)
    this.handleSubmit = this.handleSubmit.bind(this)
  }

  handleChange (event) {
    const values = this.state.values.includes(event.target.value)
      ? this.state.values
      : this.state.values.concat(event.target.value)
    this.setState({ values: values })
  }

  handleSubmit (event) {
    alert(`Your favorite flavor is: ${this.state.values}`)
    event.preventDefault()
  }

  render () {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Pick your favorite flavor:
          <select
            value={this.state.values}
            onChange={this.handleChange}
            multiple
          >
            <option value="-1">Grapefruit</option>
            <option value="0">Lime</option>
            <option value="1">Coconut</option>
            <option value="2">Mango</option>
          </select>
        </label>
        <input type="submit" value="Submit" />
      </form>
    )
  }
}
...