드롭 다운에 React JS를 사용하는 OnChange 이벤트


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

onChange이벤트가 작동하지 않습니다.

답변:


305

변경 이벤트는 <select>요소가 아닌 요소에서 트리거됩니다 <option>. 그러나 이것이 유일한 문제는 아닙니다. change함수 를 정의한 방식으로 컴포넌트를 다시 렌더링하지 않습니다. 아직 React의 개념을 완전히 파악하지 못한 것 같습니다. "Rein in React"가 도움이 될 것입니다.

선택한 값을 상태로 저장하고 값이 변경 될 때 상태를 업데이트해야합니다. 상태를 업데이트하면 구성 요소가 다시 렌더링됩니다.

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

또한 <p>요소에는 value속성 이 없습니다 . React / JSX는 잘 알려진 HTML 구문을 복제하고 사용자 지정 속성을 도입하지 않습니다 ( key및 제외 ref). 선택한 값이 <p>요소 의 내용이 되려면 정적 내용에서와 같이 단순히 요소 안에 넣으십시오.

이벤트 처리, 상태 및 양식 컨트롤에 대해 자세히 알아보십시오.


내부 텍스트 value와 동일 하지 않고 내부 텍스트를 어떻게 얻을 수 있습니까?
blankface

@ ZeroDarkThirty : 평소 :event.target.textContent
펠릭스 클링

@FelixKling textContent를 사용하면 선택 태그 내의 모든 옵션이 인쇄됩니다. 선택한 것만 얻으려면 어떻게해야합니까?
Juan

@Juan : 시도해보십시오 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);

아주 좋아요 당신은 이런 식으로 <DIV> <P> {this.state.value} </ P> </ DIV>와 변화의 결과를 볼 수 있습니다
모하마드 Farahani

21

반응 고리 (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

Felix Kling에게 감사하지만 그의 대답에는 약간의 변화가 필요합니다.

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
왜 추가 this.change.bind하고 onChange있습니까?
주니어 Usca

0

다른 구성 요소에 대해 인라인으로 select를 사용하는 경우 아래 주어진 것처럼 사용할 수도 있습니다.

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

select가 사용되는 구성 요소에서 onChange를 처리하는 함수를 다음과 같이 정의하십시오.

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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.