Sự kiện OnChange sử dụng React JS để thả xuống


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

Sự onChangekiện này không hoạt động.

Câu trả lời:


304

Sự kiện thay đổi được kích hoạt trên <select>phần tử, không phải <option>phần tử. Tuy nhiên, đó không phải là vấn đề duy nhất. Cách bạn xác định changehàm sẽ không gây ra sự tái xuất hiện của thành phần. Có vẻ như bạn chưa nắm bắt được hoàn toàn khái niệm React, vì vậy có lẽ "Thinking in React" sẽ giúp ích.

Bạn phải lưu trữ giá trị được chọn làm trạng thái và cập nhật trạng thái khi giá trị thay đổi. Cập nhật trạng thái sẽ kích hoạt sự đăng ký lại của thành phần.

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

Cũng lưu ý rằng <p>các phần tử không có valuethuộc tính. React / JSX chỉ đơn giản là sao chép cú pháp HTML nổi tiếng, nó không đưa ra các thuộc tính tùy chỉnh (ngoại trừ keyref). Nếu bạn muốn giá trị được chọn là nội dung của <p>phần tử thì chỉ cần đặt bên trong nó, giống như bạn làm với bất kỳ nội dung tĩnh nào.

Tìm hiểu thêm về xử lý sự kiện, điều khiển trạng thái và biểu mẫu:


Làm thế nào tôi có thể có được văn bản bên trong mà không valuegiống với văn bản bên trong?
trống

@ZeroDarkThenty: Thông thường:event.target.textContent
Felix Kling

@FelixKling khi tôi sử dụng textContent, nó sẽ in tất cả các tùy chọn bên trong thẻ de Chọn. Tôi có thể làm gì để chỉ nhận được lựa chọn?
Juan

@Juan: Hãy thử 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);

rất tốt. và bạn có thể thấy kết quả của sự thay đổi theo cách này <div> <p> {this.state.value} </ p> </ div>
Mohammad Farahani

21

Móc phản ứng (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

Cảm ơn bạn, Felix Kling, nhưng câu trả lời của anh ấy cần một chút thay đổi:

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
Tại sao bạn thêm this.change.bindvào onChange?
Thiếu niên Usca

0

Nếu bạn đang sử dụng chọn làm nội tuyến cho thành phần khác, thì bạn cũng có thể sử dụng như được đưa ra dưới đây.

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

Và trên thành phần nơi chọn được sử dụng, hãy xác định hàm để xử lý onChange như bên dưới:

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.