【问题标题】:ReactJS - Checkbox onChange event not firingReactJS - 复选框 onChange 事件未触发
【发布时间】:2018-08-06 03:13:58
【问题描述】:

我正在尝试在从对象呈现的 React 中实现一组复选框,如下所示:

constructor() {

    this.state.todo = {
        eat: true,
        sleep: false,
        react: true
    }

    this.toggleCheckbox = this.toggleCheckbox.bind(this);
}

toggleCheckbox(e){

    console.log(e); // nothing :-/
}

render() {

    return (
    <div>
    { Object.keys(this.state.todo).map((val, i) => (          
        <div key={i} >
            <input 
                type="checkbox" 
                value={val} 
                onChange={this.toggleCheckbox} 
                checked={this.state.todo[val]} 
                /><label>{val}</label>
        </div>
     ))}
     </div>
    )
}

一切都正确呈现,但我无法更改任何复选框。控制台记录 toggleCheck() 事件未被触发。

我尝试过使用onClickonChange,但没有效果。

【问题讨论】:

  • 实际上是 CSS 中的问题,而不是 JS。这些复选框是使用

标签: javascript reactjs data-binding checkboxlist react-dom


【解决方案1】:

您从this.state.tables 获取密钥,但您的状态称为this.state.todo

您可以将每个值用作name,并用它来切换相关的todo 状态属性。

示例

class App extends React.Component {
  state = {
    todo: {
      eat: true,
      sleep: false,
      react: true
    }
  };

  toggleCheckbox = e => {
    const { name } = e.target;
    this.setState(prevState => ({
      todo: {
        ...prevState.todo,
        [name]: !prevState.todo[name]
      }
    }));
  };

  render() {
    return (
      <div>
        {Object.keys(this.state.todo).map((val, i) => (
          <div key={i}>
            <input
              type="checkbox"
              name={val}
              onChange={this.toggleCheckbox}
              checked={this.state.todo[val]}
            />
            <label>{val}</label>
          </div>
        ))}
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="root"></div>

【讨论】:

  • 我正想问this.state.tables,因为我正在尝试?
  • 抱歉,打错了。 this.state.tables 在我的实际代码中 - todo 用于此示例,但我忘记更改该行
  • @yevg 啊,我明白了。没关系。你能在例如创建一个Minimal, Complete, and Verifiable example吗? CodeSandbox,或者答案对你有用吗?
猜你喜欢
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多