当我点击复选框时,复选标记并没有消失,尽管控制台已经关闭.登录onChange处理程序表示状态已更改为false.另一方面,当通过单独的按钮更改状态时,复选标记会正确地打开和关闭.

export default class TestComponent extends Component {

constructor(props) {
    super(props);
    this.state = {
        is_checked: true
    };
    this.updateCheckbox = this.updateCheckbox.bind(this);
    this.pressButton = this.pressButton.bind(this);
}
updateCheckbox(event) {
    event.preventDefault();

    this.setState({is_checked: !this.state.is_checked});
    console.log(this.state.is_checked);  // This logs 'false' meaning the click did cause the state change 
    console.log(event.target.checked);  // However, this logs 'true' because the checkmark is still there 

}
pressButton(event){
    event.preventDefault();
    this.setState({is_checked: !this.state.is_checked});
}
render(){

    return (
   <input type="checkbox" onChange={this.updateCheckbox} checked={this.state.is_checked} ></input>
   <button  onClick={this.pressButton}>change checkbox state using button</button>
    );
}
}

推荐答案

我想我知道发生了什么.

单击按钮,它将切换is_checked,这将选中或取消选中该框.但这最终会触发复选框的onChange,这也会切换状态...你实际上编写了一个无限循环.尽管如此,由于React会对setState个操作进行批处理/go Bounce,所以代码不会锁定页面.

试试这个:

2019年hooks API更新:

import React, { useState } from 'react';

const Component = () => {
  const [isChecked, setIsChecked] = useState(true);

  return (
    <div>
      <input
        type="checkbox"
        onChange={(event) => setIsChecked(event.currentTarget.checked)}
        checked={isChecked}
      />
      <button onClick={() => setIsChecked(!isChecked)}>
        change checkbox state using this button
      </button>
    </div>
  );
};

原件:

var React = require("react");

var Component = React.createClass({
    getInitialState: function() {
        return {
            isChecked: true
        };
    },

    handleCheckboxChange: function(event) {
        console.log("checkbox changed!", event);
        this.setState({isChecked: event.target.checked});
    },

    toggleIsChecked: function() {
        console.log("toggling isChecked value!");
        this.setState({isChecked: !this.state.isChecked});
    },

    handleButtonClick: function(event) {
        console.log("button was pressed!", event);
        this.toggleIsChecked();
    },

    render: function() {
        return (
            <div>
                <input type="checkbox" onChange={this.handleCheckboxChange} checked={this.state.isChecked} />
                <button onClick={this.handleButtonClick}>change checkbox state using this button</button>
            </div>
        );
    }
});

module.exports = Component;

请注意,通过使用React的valueLink,您可以使此代码更加干净(请在此处阅读更多信息:https://facebook.github.io/react/docs/two-way-binding-helpers.html)

Reactjs相关问答推荐

Shadck/ui Select -当用户 Select 项目时更改状态

为什么安装FLOBIT后,所有的输入FIELD现在都有一个蓝色的轮廓?

react -在选项中 Select 我想要显示和图像.但当我 Select 该选项时,我希望控件仅显示该选项的文本部分

在REACT-RUTER-DOMV6中使用通用页面包装组件有问题吗?

在新屏幕上显示照片时出现问题-react

在构建或部署Reaction应用程序时出错

使用 React + Vite 范围化 CSS

如何在react 中过滤数组的数组?

获取更多数据后更新 DOM,而不刷新 React.js 中的页面

Spring Boot + React + MySQL应用的架构层面有哪些?

臭名昭著的测试未包含在 act(...) 中

使用状态与复选框不同步

当每个元素都可拖动时,移动设备上的滚动列表出现问题

react - 警告:列表中的每个子元素都应该有一个独特的 keys props ,即使我已经设置了 keys

如何在 nextjs 中单击按钮时动态导入和渲染组件?

具有自动完成功能的 Formik material ui 无法按预期工作

react 页面更新

未捕获的错误:操作必须是使用 redux/toolkit 的普通对象

多次响应获取发送请求

下拉菜单在 AppBar 中未正确对齐