使用 React JS 进行下拉的 OnChange 事件

IT技术 javascript reactjs
2021-02-10 14:06:59
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事件不起作用。

6个回答

更改事件是在<select>元素上触发的,而不是在<option>元素上触发然而,这并不是唯一的问题。您定义change函数的方式不会导致组件的重新渲染。看起来你可能还没有完全掌握 React 的概念,所以也许“Thinking 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 语法,它没有引入自定义属性(除了keyref)。如果您希望所选值成为<p>元素的内容,那么只需将其放入其中,就像处理任何静态内容一样。

了解有关事件处理、状态和表单控件的更多信息:

@ZeroDarkThirty:通常: event.target.textContent
2021-03-17 14:06:59
@FelixKling 当我使用 textContent 时,它会打印 de Select 标签内的所有选项。我该怎么做才能只获得选定的?
2021-03-26 14:06:59
@胡安:试试event.target.slectedOptions[0].label
2021-03-28 14:06:59
@FelixKin:在 onChange 函数中使用 event.persist() 作为目标,如果不使用它,它将为空。
2021-03-29 14:06:59
如何在不与内部文本value相同的情况下获取内部文本?
2021-03-31 14:06:59

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 key={o.value} value={o.value}>{o.label}</option>
        ))}
      </select>
  );
};
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>
2021-04-04 14:06:59

如果您使用 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);
}
  handleChange(value, selectOptionSetter) => {
     selectOptionSetter(value)
     // handle other stuff like persisting to store etc
   }

  const Dropdown = (props) => {
  const { options } = props;
  const [selectedOption, setSelectedOption] = useState(options[0].value);
  return (
      <select
        value={selectedOption}
        onChange={e => handleChange(e.target.value, setSelectedOption)}>
        {options.map(o => (
          <option key={o.value} value={o.value}>{o.label}</option>
        ))}
      </select>
  );
};