Acara OnChange menggunakan React JS for drop down

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

The onChangeevent tidak bekerja.

pengguna544079
sumber

Jawaban:

306

Acara perubahan dipicu pada <select>elemen, bukan <option>elemen. Namun, itu bukan satu-satunya masalah. Cara Anda mendefinisikan changefungsi tidak akan menyebabkan rerender komponen. Sepertinya Anda mungkin belum sepenuhnya memahami konsep Bereaksi, jadi mungkin "Berpikir dalam Bereaksi" membantu.

Anda harus menyimpan nilai yang dipilih sebagai status dan memperbarui status saat nilai berubah. Memperbarui status akan memicu rerender komponen.

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

Perhatikan juga bahwa <p>elemen tidak memiliki valueatribut. Bereaksi / JSX hanya mereplikasi sintaks HTML yang terkenal, itu tidak memperkenalkan atribut khusus (dengan pengecualian dari keydan ref). Jika Anda ingin nilai yang dipilih menjadi konten <p>elemen maka cukup masukkan ke dalamnya, seperti yang akan Anda lakukan dengan konten statis apa pun.

Pelajari lebih lanjut tentang penanganan acara, kontrol status dan formulir:

Felix Kling
sumber
bagaimana saya bisa mendapatkan teks bagian dalam tanpa valuemenjadi sama dengan teks bagian dalam?
blankface
@ZeroDarkThirty: Biasa:event.target.textContent
Felix Kling
@ Felkling ketika saya menggunakan textContent, ia mencetak semua opsi di dalam Tag pilih. Apa yang bisa saya lakukan untuk mendapatkan hanya yang terpilih?
Juan
@Juan: Coba 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
sumber
Baik sekali. dan Anda dapat melihat hasil perubahan dengan cara ini <div> <p> {this.state.value} </p> </div>
Mohammad Farahani
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
sumber
1

Terima kasih Felix Kling, tetapi jawabannya perlu sedikit perubahan:

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
sumber
2
Mengapa Anda menambahkan this.change.binddi onChange?
Junior Usca
0

Jika Anda menggunakan pilih sebagai inline ke komponen lain, maka Anda juga dapat menggunakan seperti yang diberikan di bawah ini.

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

Dan pada komponen di mana pilih digunakan, tentukan fungsi untuk menangani onChange seperti di bawah ini:

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