【问题标题】:React checkbutton onChange event returns synthetic eventReact checkbutton onChange 事件返回合成事件
【发布时间】:2019-12-14 10:44:59
【问题描述】:

我有一个 React 复选框组件。我试图在每次点击时更改状态并根据之前的状态运行一个函数。在 React 上,每次单击按钮时,我都试图将事件返回到 index.js 中的 console.log 函数。

但它总是返回合成事件,我无法到达 event.target.value。

我的 index.js 和 props 是;

ReactDOM.render(<ReactCheckBox
    isChecked={false}
    textCheck="Checked"
    textUncheck="Checked"
    onCheckedRun={event => console.log(event.target)}
    onUncheckedRun={event => console.log(event.target)}
    buttonPosition="right"
/>, document.getElementById('myCheckBox'))

我的 ReactCheckBox 组件是;

import React, { Component } from 'react'

class ReactCheckBox extends Component {
    constructor(props) {
        super(props)
        this.state = {
            checked: ""
        }
        this.onChangeHandler = this.onChangeHandler.bind(this)

    }
    componentDidMount() {
        this.setState({
            checked: this.props.isChecked
        })
    }

    onChangeHandler(event) {
        this.setState(function (previousState, props) {
            console.log('State: ',this.state.checked)
            if (previousState.checked === true) {
                props.onCheckedRun(event)
            } else {
                props.onUncheckedRun(event)
            }
            return {
                checked: !this.state.checked
            }
        }
        )
    }

    render() {
        if (this.props.disabled === "true") {
            return (
                <div>
                    <div className="form-check">
                        <label className="form-check-label">
                            <div className="uniform-checker border-primary-600 text-primary-800">
                                <span className="checked">
                                    <input onChange={this.onChangeHandler} type="checkbox" className="form-check-input-styled-primary" defaultChecked={this.state.checked ? 'checked' : 'unchecked'} data-fouc="" disabled></input>
                                </span>
                            </div>
                            Primary checkbox
                        </label>
                    </div>
                </div>

            )
        }
        else {
            return (
                <div>
                    <div>
                        <div className="form-check">
                            <label className="form-check-label">
                                <div className="uniform-checker border-primary-600 text-primary-800">
                                    <span className={this.state.checked ? 'checked' : 'unchecked'}>
                                        <input onChange={this.onChangeHandler} type="checkbox" className="form-check-input-styled-primary" defaultChecked={this.state.checked ? 'checked' : 'unchecked'} ></input>
                                    </span>
                                </div>
                                Primary checkbox
                            </label>
                        </div>
                    </div>
                </div>
            )
        }
    }
}

export default ReactCheckBox

有人遇到过同样的问题吗?我怎样才能克服合成事件并获得真实事件,从而达到它的价值?

更新

综合错误事件

index.js:1375 警告:此合成事件被重复使用以提高性能 原因。如果你看到这个,你正在访问该方法 currentTarget 发布/无效的合成事件。这是一个 无操作功能。如果您必须保留原始合成事件, 使用 event.persist()。有关更多信息,请参见 fb.me/react-event-pooling 信息。

【问题讨论】:

  • 你可能想看看here

标签: javascript reactjs


【解决方案1】:

代替event.target 尝试event.currentTarget 来获取特定的目标元素。

更新: 关于您的更新和错误,您可以尝试这样做: 而不是使用&lt;input onChange={this.onChangeHandler}&gt; 这样做:

<input onChange={(e)=>{this.onChangeHandler(e)}}>

或者只是:

<input onChange={(e)=>{onchangeHandler(e)}}>

所以整行应该是:

<input onChange={()=>{this.onChangeHandler(e)}} type="checkbox" className="form-check-input-styled-primary" defaultChecked={this.state.checked ? 'checked' : 'unchecked'} ></input>

【讨论】:

  • 感谢您的建议,我学到了一些东西,但我仍然遇到同样的错误。我添加了错误,请参阅更新的问题。
  • @Capan 好的,看看我的更新。我认为您实际上从未真正传递事件本身,因此其中一个修复程序应该解决该问题并传递正确的事件。让我知道它是否有效。
  • 问题仍然存在@aviya.developer
【解决方案2】:

如果你想要结果,Yoy 可以试试这个。

console.log(event.currentTarget.checked);

它会返回真或假

不用做

<input onChange={(e)=>{onchangeHandler(e)}}>

更新

综合错误事件

index.js:1375 警告:此合成事件被重复使用以提高性能 原因。如果你看到这个,你正在访问该方法 currentTarget 在已发布/无效的合成事件上。这是一个无操作 功能。如果您必须保留原始合成事件,请使用 event.persist()。请参阅 fb.me/react-event-pooling 了解更多信息。

简单的调用。

 onChangeHandler(event) {
    event.persist();
    this.setState(function(previousState, props) {
      console.log("State: ", this.state.checked);
      if (previousState.checked === true) {
        props.onCheckedRun(event.currentTarget.checked);
      } else {
        props.onUncheckedRun(event.currentTarget.checked);
      }
      return {
        checked: !this.state.checked
      };
    });   }

【讨论】:

  • 好吧,我已经尝试了您的解决方案,但我仍然遇到同样的问题。 event.currentTarget.value 返回一个未定义的值
  • 复选框永远不会给你event.currentTarget.checked。它只返回选中或未选中状态作为布尔值。 event.currentTarget.checked 是真还是假。 @卡潘
猜你喜欢
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 2021-08-23
  • 1970-01-01
  • 2019-03-22
  • 2021-04-08
相关资源
最近更新 更多