Açılır menü için React JS kullanarak OnChange olayı


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

onChangeOlay çalışmıyor.

Yanıtlar:


306

Change olayı <select>öğe üzerinde değil, <option>öğe üzerinde tetiklenir . Ancak, tek sorun bu değil. changeİşlevi tanımlama şekliniz bileşenin yeniden oluşturulmasına neden olmaz. Görünüşe göre henüz Tepki kavramını tam olarak kavrayamamış olabilirsiniz, belki de "Tepki içinde Düşünme" yardımcı olabilir.

Seçilen değeri durum olarak kaydetmeniz ve değer değiştiğinde durumu güncellemeniz gerekir. Durumun güncellenmesi, bileşenin yeniden gönderilmesini tetikler.

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

Ayrıca, <p>öğelerin bir valueniteliği olmadığını unutmayın . JSX yeterlidir (hariç özel özellikler tanıtmak değil, tanınmış bir HTML sözdizimi çoğaltır / tepki keyve ref). Seçilen değerin <p>öğenin içeriği olmasını istiyorsanız, herhangi bir statik içerikte yaptığınız gibi öğenin içine koymanız yeterlidir.

Olay işleme, durum ve form denetimleri hakkında daha fazla bilgi edinin:


iç metnin valueaynısı olmadan iç metni nasıl alabilirim ?
blankface

@ZeroDarkThirty: Her zamanki gibi:event.target.textContent
Felix Kling

@FelixKling metnini kullandığımda de Select etiketi içindeki tüm seçenekleri yazdırır. Yalnızca seçilenleri almak için ne yapabilirim?
Juan

@Juan: Deneyin 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);

çok iyi. ve değişikliğin sonucunu bu şekilde görebilirsiniz <div> <p> {this.state.value} </p> </div>
Mohammad Farahani

21

Reaksiyon Kancaları (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>
  );
};

1

Teşekkürler Felix Kling, ama cevabının biraz değişmesi gerekiyor:

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
Neden ekliyorsunuz this.change.bindiçinde onChange?
Junior Usca

0

Select'i başka bir bileşene satır içi olarak kullanıyorsanız, aşağıda verilen şekilde de kullanabilirsiniz.

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

Ve select öğesinin kullanıldığı bileşende, onChange öğesinin işleneceği işlevi aşağıdaki gibi tanımlayın:

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.