【问题标题】:onChange is not triggering in react jsonChange 没有在反应 js 中触发
【发布时间】:2019-02-19 22:43:06
【问题描述】:

我在 react js 应用中使用下拉菜单,但 onChange 没有触发

我的代码是

import React from "react";
import PropTypes from "prop-types";
import Dropdown from 'react-dropdown';
const options = [
   { value: 'one', label: 'One' },
   { value: 'two', label: 'Two', className: 'myOptionClassName' },

 ];

 class WebDashboardPage extends React.Component {

  constructor(props) {
  super(props);
  this.state = {}
  }

 quan = (event)=> {
console.log("Option selected:");
 this.setState({ value: event.target.value });
};

render() {

return(
  <b><Dropdown className="dropdownCss" options={options} onChange={e => 
  this.quan(e.target.value)} /></b>
 );

}

当我单击下拉列表中的项目时,它会显示错误

"TypeError: 无法读取未定义的属性 'quan'"

我是反应新手 提前致谢

【问题讨论】:

  • 这应该是 onChange={e => this.quan(e)} 或 onChange={this.quan}
  • 它不工作显示同样的错误
  • 您在组件的任何位置都定义了两次 quan 吗?因为 quan 是您代码中的一个函数,但错误表示属性,所以您必须在组件中的其他位置定义 quan
  • @Think-Twice 我彻底检查了我的代码中没有其他 quan
  • 好吧,做一件事在线托管您的代码并分享链接,或者在这里分享您的所有代码,这是帮助您的唯一方法

标签: javascript reactjs drop-down-menu react-redux react-component


【解决方案1】:

react-dropdown 库没有问题。这是我设置并更正了 OP 代码的code sandbox。有用。

import React from "react";
import Dropdown from "react-dropdown";
import "react-dropdown/style.css";
const options = [
  { value: "one", label: "One" },
  { value: "two", label: "Two", className: "myOptionClassName" }
];
const defaultOption = options[0];
class WebDashboardPage extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      selectedValue: ""
    };
  }

  quan = value => {
    this.setState({ selectedValue: value });
  };

  render() {
    return (
      <Dropdown options={options} value={defaultOption} onChange={this.quan} />
    );
  }
}

export default WebDashboardPage;  

【讨论】:

    【解决方案2】:

    你应该这样做:

    <Dropdown className="dropdownCss" options={options} onChange={this.quan} />
    

    试试这个:

     class WebDashboardPage extends React.Component {
    
          constructor(props) {
          super(props);
          this.state = { value: '' }
          this.quan = this.quan.bind(this);
          }
    
         quan(event) {
         console.log("Option selected:");
         this.setState({ value: event.target.value });
        };
    
        render() {
    
        return(
          <div><Dropdown className="dropdownCss" options={options} onChange={this.quan} /></div>
         );
    
        }
    

    【讨论】:

    • 它不工作同样的错误是显示任何其他解决方案
    • 我尝试了您的代码,但在进入应用程序之前显示错误“TypeError: Cannot read property 'quan' of undefined”
    • 这意味着你忘记添加 this.quan = this.quan.bind(this);内部构造函数
    【解决方案3】:

    看来问题出在react-dropdown 组件本身。您需要在那里提出问题。

    react-dropdown 组件可能没有在某处使用this.props.onChange,或者可能使用有问题。


    或者,很可能,组件需要value 未定义的状态?

    this.state = {
      value: ''
    }
    

    导致问题的原因是什么?

    【讨论】:

    • 以上方法我都试过了,问题依旧存在
    【解决方案4】:

    您使用的下拉依赖项不会以事件作为参数触发 onChange,而是使用所选选项触发 onChange。尝试更改

    onChange={e => 
      this.quan(e.target.value)}
    

    onChange={this.quan}
    

    把 quan 改成

    quan = (selectedOption)=> {
     console.log("Option selected:"+selectedOption.value);
     this.setState({ value: selectedOption.value });
    };
    

    我已经在我的机器上试过了,它运行良好。下一个重要的事情是不要以您正在做的方式放置选项,而是将其置于状态。我的最终代码是

    class WebDashboardPage extends Component {
    
    constructor(props) {
    super(props);
    
    const options = [
      {
        value: 'one',
        label: 'One'
      }, {
        value: 'two',
        label: 'Two',
        className: 'myOptionClassName'
      }
    ];
    
    this.state = {options}
    }
    
    quan = (selectedOption) => {
    console.log("Option selected:" + selectedOption.value);
    this.setState({value: selectedOption.value});
    };
    render() {
    return (<b><Dropdown className="dropdownCss" options={this.state.options} onChange={this.quan}/></b>);
    }
    }
    

    【讨论】:

    • 我已经粘贴了我尝试过的代码。它应该可以工作
    【解决方案5】:

    我只对代码做了一点重构。主要变化在于Dropdown 处理变化的方式。当您将一个函数传递给handleChange 时,Dropdown 在内部调用该函数并将所选对象传递给它,因此您需要做的就是创建一个处理程序方法,该方法具有一个参数,您将使用该参数来更新状态。我还为 value 设置了一个初始状态。这是一个演示https://codesandbox.io/s/4qz7n0okyw

    import React,  { Component, Fragment } from "react";
    import ReactDOM from "react-dom";
    import Dropdown from "react-dropdown";
    
    const options = [
      { value: "one", label: "One" },
      { value: "two", label: "Two", className: "myOptionClassName" }
    ];
    
    class WebDashboardPage extends Component {
      state = {
        value: {}
      };
    
      quan = value => {
        console.log("Option selected:", value);
        this.setState({ value });
      };
    
      render() {
        return (
          <Fragment>
            <Dropdown
              className="dropdownCss"
              options={options}
              onChange={this.quan}
            />
          </Fragment>
        );
      }
    }
    
    export default WebDashboardPage;
    

    【讨论】:

      【解决方案6】:

      更改为 onChange={this.quan},同样在初始状态下你应该声明你的 this.state.value

      this.state = {
       value: ''
      }
      

      也尝试在 html 元素上学习它,而不是在 jsx 上

      【讨论】:

      • 它不工作同样的错误是显示任何其他解决方案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 2021-04-25
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 2018-12-05
      相关资源
      最近更新 更多