Événement OnChange utilisant React JS pour la liste déroulante

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

L' onChangeévénement ne fonctionne pas.

user544079
la source

Réponses:

306

L'événement de modification est déclenché sur l' <select>élément, pas sur l' <option>élément. Cependant, ce n'est pas le seul problème. La manière dont vous avez défini la changefonction n'entraînera pas de réexécution du composant. Il semble que vous n'ayez pas encore pleinement compris le concept de React, alors peut-être que "Penser en React" vous aidera.

Vous devez stocker la valeur sélectionnée comme état et mettre à jour l'état lorsque la valeur change. La mise à jour de l'état déclenchera un nouveau rendu du composant.

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

Notez également que les <p>éléments n'ont pas d' valueattribut. React / JSX réplique simplement la syntaxe HTML bien connue, il n'introduit pas d'attributs personnalisés (à l'exception de keyet ref). Si vous voulez que la valeur sélectionnée soit le contenu de l' <p>élément, insérez-la simplement à l'intérieur, comme vous le feriez avec n'importe quel contenu statique.

En savoir plus sur la gestion des événements, les contrôles d'état et de formulaire:

Félix Kling
la source
comment puis-je obtenir le texte intérieur sans qu'il valuesoit identique au texte intérieur?
blankface
@ZeroDarkThirty: L'habituel:event.target.textContent
Felix Kling
@FelixKling lorsque j'utilise textContent, il imprime toutes les options à l'intérieur de la balise Select. Que puis-je faire pour n'obtenir que les sélectionnés?
Juan
@Juan: Essayez 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
la source
très bon. et vous pouvez voir le résultat du changement de cette façon <div> <p> {this.state.value} </p> </div>
Mohammad Farahani
21

Crochets de réaction (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
la source
1

Merci Felix Kling, mais sa réponse a besoin d'un petit changement:

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
la source
2
Pourquoi ajoutez - vous this.change.binden onChange?
Junior Usca du
0

Si vous utilisez select comme en ligne avec un autre composant, vous pouvez également utiliser comme indiqué ci-dessous.

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

Et sur le composant où select est utilisé, définissez la fonction à gérer onChange comme ci-dessous:

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