Событие OnChange с использованием React JS для выпадающего

158
var MySelect = React.createClass({
     change: function(){
         return document.querySelector('#lang').value;
     },
     render: function(){
        return(
           <div>
               <select id="lang">
                  <option value="select" onChange={this.change}>Select</option>
                  <option value="Java" onChange={this.change}>Java</option>
                  <option value="C++" onChange={this.change}>C++</option>
               </select>
               <p></p>
               <p value={this.change}></p>
           </div>
        );
     }
});

React.render(<MySelect />, document.body);

onChangeСобытие не работает.

user544079
источник

Ответы:

306

Событие изменения инициируется <select>элементом, а не <option>элементом. Однако это не единственная проблема. То, как вы определили changeфункцию, не вызовет повторного рендеринга компонента. Кажется, что вы, возможно, еще не полностью поняли концепцию React, поэтому, возможно, «Thinking in React» поможет.

Вы должны сохранить выбранное значение как состояние и обновлять состояние при изменении значения. Обновление состояния вызовет повторную визуализацию компонента.

var MySelect = React.createClass({
     getInitialState: function() {
         return {
             value: 'select'
         }
     },
     change: function(event){
         this.setState({value: event.target.value});
     },
     render: function(){
        return(
           <div>
               <select id="lang" onChange={this.change} value={this.state.value}>
                  <option value="select">Select</option>
                  <option value="Java">Java</option>
                  <option value="C++">C++</option>
               </select>
               <p></p>
               <p>{this.state.value}</p>
           </div>
        );
     }
});

React.render(<MySelect />, document.body);

Также обратите внимание, что <p>элементы не имеют valueатрибута. React / JSX просто копирует хорошо известный синтаксис HTML, он не вводит настраиваемые атрибуты (за исключением keyи ref). Если вы хотите, чтобы выбранное значение было содержимым <p>элемента, просто поместите его внутрь, как вы бы сделали с любым статическим содержимым.

Узнайте больше об обработке событий, управлении состоянием и формой:

Феликс Клинг
источник
Как я могу получить внутренний текст, не valueбудучи таким же, как внутренний текст?
blankface
@ZeroDarkThirty: обычный:event.target.textContent
Феликс Клинг
@FelixKling, когда я использую textContent, он печатает все параметры внутри тега de Select. Что я могу сделать, чтобы получить только выбранный?
Хуан
@Juan: попробуй event.target.slectedOptions[0].label.
Феликс Клинг
40
import React, { PureComponent, Fragment } from 'react';
import ReactDOM from 'react-dom';

class Select extends PureComponent {
  state = {
    options: [
      {
        name: 'Select…',
        value: null,
      },
      {
        name: 'A',
        value: 'a',
      },
      {
        name: 'B',
        value: 'b',
      },
      {
        name: 'C',
        value: 'c',
      },
    ],
    value: '?',
  };

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

  render() {
    const { options, value } = this.state;

    return (
      <Fragment>
        <select onChange={this.handleChange} value={value}>
          {options.map(item => (
            <option key={item.value} value={item.value}>
              {item.name}
            </option>
          ))}
        </select>
        <h1>Favorite letter: {value}</h1>
      </Fragment>
    );
  }
}

ReactDOM.render(<Select />, window.document.body);
Кирк Стробек
источник
очень хорошо. и вы можете увидеть результат изменения следующим образом: <div> <p> {this.state.value} </ p> </ div>
Мохаммад Фарахани,
21

React Hooks (16.8+):

const Dropdown = ({
  options
}) => {
  const [selectedOption, setSelectedOption] = useState(options[0].value);
  return (
      <select
        value={selectedOption}
        onChange={e => setSelectedOption(e.target.value)}>
        {options.map(o => (
          <option value={o.value}>{o.label}</option>
        ))}
      </select>
  );
};
ahota
источник
1

Спасибо Феликсу Клингу, но его ответ нуждается в небольшом изменении:

var MySelect = React.createClass({
 getInitialState: function() {
     return {
         value: 'select'
     }
 },
 change: function(event){
     this.setState({value: event.target.value});
 },
 render: function(){
    return(
       <div>
           <select id="lang" onChange={this.change.bind(this)} value={this.state.value}>
              <option value="select">Select</option>
              <option value="Java">Java</option>
              <option value="C++">C++</option>
           </select>
           <p></p>
           <p>{this.state.value}</p>
       </div>
    );
 }
});
React.render(<MySelect />, document.body); 
Абольфазл Миадиан
источник
2
Почему Вы добавляете this.change.bindв onChange?
Юниор Usca
0

Если вы используете select как inline для другого компонента, вы также можете использовать, как указано ниже.

<select onChange={(val) => this.handlePeriodChange(val.target.value)} className="btn btn-sm btn-outline-secondary dropdown-toggle">
    <option value="TODAY">Today</option>
    <option value="THIS_WEEK" >This Week</option>
    <option value="THIS_MONTH">This Month</option>
    <option value="THIS_YEAR">This Year</option>
    <option selected value="LAST_AVAILABLE_DAY">Last Availabe NAV Day</option>
</select>

А в компоненте, где используется select, определите функцию для обработки onChange, как показано ниже:

handlePeriodChange(selVal) {
    this.props.handlePeriodChange(selVal);
}
Сатиш
источник
0
var MySelect = React.createClass({
getInitialState: function() {
 

var MySelect = React.createClass({
 getInitialState: function() {
     return {
         value: 'select'
     }
 },
 change: function(event){
     event.persist(); //THE MAIN LINE THAT WILL SET THE VALUE
     this.setState({value: event.target.value});
 },
 render: function(){
    return(
       <div>
           <select id="lang" onChange={this.change.bind(this)} value={this.state.value}>
              <option value="select">Select</option>
              <option value="Java">Java</option>
              <option value="C++">C++</option>
           </select>
           <p></p>
           <p>{this.state.value}</p>
       </div>
    );
 }
});
React.render(<MySelect />, document.body); 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

Сурав Пуркаит
источник