【问题标题】:How to handle checkbox checked status in reactJS如何处理reactJS中的复选框选中状态
【发布时间】:2019-02-08 06:58:35
【问题描述】:

我的 React 类 B.js 中有多个复选框:

<input
   type="checkbox"
   inline={true}
   checked={this.props.checkBoxDefaultStatus}
   onChange={this.handleCheckBoxClick} 
/>

现在 prop checkBoxDefaultStatus 是从父类 A.js 传递的。

A.js

this.state = {
  checkBoxDefaultStatus: false
}

handleMultiSelect() {
    this.setState({
        checkBoxDefaultStatus: true
    })
}

render() {
  <B checkBoxDefaultStatus={this.state.checkBoxDefaultStatus} />
}

编辑:现在,当我单击父复选框时,我的所有子复选框都会被选中,但问题是当我单击它们时,我的子复选框的选中状态不会改变,因为它们已经由父属性设置.我也需要一些方法来维护它。

这是我想要的行为https://stackoverflow.com/a/35218069/6574017

【问题讨论】:

  • 可能会在调用函数之前渲染 DOM - 尝试在加载 DOM 后运行它..

标签: reactjs


【解决方案1】:

如果你想改变子组件内部的父组件状态,那么你必须将父组件方法传递给子组件,如下所示,

<B handleCheckBoxClick={this.handleMultiSelect}/>   

检查下面的工作代码。我为您的场景构建了 2 个组件。

class B extends React.Component {
   constructor(){
    super();
    this.state = {
      checkBoxClick : {
        1: false,
        2: false
      }
    }
    this.handleCheckBoxClick = this.handleCheckBoxClick.bind(this);
   }
   
   handleCheckBoxClick(no, event){
    //console.log('no', no);
    //console.log('event.target.value', event);
    var checkBoxClick = this.state.checkBoxClick;
    checkBoxClick[no] = !this.state.checkBoxClick[no];
    this.setState({
      checkBoxClick
    });
    
    var alltrue =Object.keys(checkBoxClick).every((k) =>{ return checkBoxClick[k] });
    //console.log('alltrue', alltrue);
    if(alltrue){
      // console.log('alltrue in if : ', alltrue);
      this.props.handleMultiSelect();
    }
    
    if(this.props.checkBoxDefaultStatus){
      this.props.handleMultiSelect();
    }
   }

  render(){
    //console.log('this.state.checkBoxClick :', this.state.checkBoxClick);
    //console.log('this.props.checkBoxDefaultStatus :', this.props.checkBoxDefaultStatus);
    return(
    <div>
    Child component check-box <br />
      <input
       type="checkbox"
       checked={this.props.checkBoxDefaultStatus ? this.props.checkBoxDefaultStatus : this.state.checkBoxClick[1]}
       onChange={(e) => {this.handleCheckBoxClick(1, e.target.checked)}} 
    /> Bar 1<br />
    <input
       type="checkbox"
       checked={this.props.checkBoxDefaultStatus ? this.props.checkBoxDefaultStatus : this.state.checkBoxClick[2]}
       onChange={(e) => {this.handleCheckBoxClick(2, e.target.checked)}} 
    /> Bar 2<br />
    </div>
    );
  }
}

class A extends React.Component {

  constructor() {
    super();
    this.state = {
      checkBoxDefaultStatus: false
    }
    
    this.handleMultiSelect = this.handleMultiSelect.bind(this);
  }

  handleMultiSelect() {
    //console.log('aaaa')
    this.setState({
      checkBoxDefaultStatus: !this.state.checkBoxDefaultStatus
    })
  }

  render() {
  //console.log('checkBoxDefaultStatus :', this.state.checkBoxDefaultStatus);

    return (
    <div>
      <input type="checkbox" onClick={() => {this.handleMultiSelect()}} checked={this.state.checkBoxDefaultStatus}/>
      Check all<br />
      <B checkBoxDefaultStatus={this.state.checkBoxDefaultStatus}
        handleMultiSelect={()=>{this.handleMultiSelect()}}
      />
      </div>
    );
  }
}

ReactDOM.render( < A / > , 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>

【讨论】:

  • 我编写了完全相同的代码,当我单击父复选框时,我的所有子复选框都被选中,但问题是我的子复选框选中状态在我单击它们时不会改变因为它们是由父道具设置的。我也需要一些方法来维护它。
  • stackoverflow.com/questions/386281/… 你想要同样的场景
  • 是的,这正是我想要的,但在我的情况下,只有 checkAll 工作,因为单个点击不起作用....如何在 React 中做到这一点
  • 在你的代码中 checkAll 在父组件和单个组件在子组件?
【解决方案2】:

请使用 checked 属性而不是 defaultChecked 像这样:

<input
   type="checkbox"
   inline={true}
   checked={this.props.checkBoxDefaultStatus}
   onChange={this.handleCheckBoxClick} 
/>

【讨论】:

  • 对受控组件使用checked,如果您想要不受控组件,则使用defaultChecked。这是 React 中的一个重要概念,在这里解释:reactjs.org/docs/uncontrolled-components.html“在大多数情况下,我们建议使用受控组件来实现表单。在受控组件中,表单数据由 React 组件处理。替代方案是不受控制的组件,其中表单数据由 DOM 本身处理。”
  • @HåkenLid 是的,我明白这一点,但我认为这从来都不是问题,我想要的是这种行为stackoverflow.com/a/35218069/6574017 但在我的情况下,因为我使用父道具设置检查属性,所以子复选框不是无法自行改变。
猜你喜欢
  • 2018-03-18
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2019-05-26
  • 2017-06-04
相关资源
最近更新 更多