Evento OnChange usando React JS para desplegable

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);

El onChangeevento no funciona.

usuario544079
fuente

Respuestas:

306

El evento de cambio se activa en el <select>elemento, no en el <option>elemento. Sin embargo, ese no es el único problema. La forma en que definió la changefunción no provocará una devolución del componente. Parece que todavía no has entendido completamente el concepto de React, por lo que tal vez "Pensar en reaccionar" ayude.

Debe almacenar el valor seleccionado como estado y actualizar el estado cuando cambie el valor. La actualización del estado desencadenará una devolución del componente.

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);

También tenga en cuenta que los <p>elementos no tienen un valueatributo. React / JSX simplemente replica la conocida sintaxis HTML, no introduce atributos personalizados (con la excepción de keyy ref). Si desea que el valor seleccionado sea el contenido del <p>elemento, simplemente colóquelo dentro, como lo haría con cualquier contenido estático.

Obtenga más información sobre el manejo de eventos, los controles de estado y formulario:

Felix Kling
fuente
¿Cómo puedo obtener el texto interno sin que valuesea ​​el mismo que el texto interno?
blankface
@ZeroDarkThirty: Lo habitual:event.target.textContent
Felix Kling el
@FelixKling cuando uso textContent, imprime todas las opciones dentro de la etiqueta Select. ¿Qué puedo hacer para obtener solo lo seleccionado?
Juan
@Juan: Intenta event.target.slectedOptions[0].label.
Felix Kling
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);
Kirk Strobeck
fuente
muy bien. y puede ver el resultado del cambio de esta manera <div> <p> {this.state.value} </p> </div>
Mohammad Farahani
21

Ganchos de reacción (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
fuente
1

Gracias Felix Kling, pero su respuesta necesita un pequeño cambio:

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); 
Abolfazl Miadian
fuente
2
¿Por qué estás agregando this.change.binden onChange?
Junior Usca
0

Si está utilizando select como en línea con otro componente, también puede usar como se indica a continuación.

<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>

Y en el componente donde se usa select, defina la función para manejar onChange como se muestra a continuación:

handlePeriodChange(selVal) {
    this.props.handlePeriodChange(selVal);
}
Satish
fuente
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>

Sourav Purkait
fuente