ReactJS MaterialUI 复选框 - 在 onCheck() 中设置状态

ReactJS MaterialUI Checkboxes- setting state within onCheck()

使用 material-ui 0.15.3react 15.3.0

我有一个复选框组件,想在其 onCheck 功能中使用 this.setState

很快我就发现我必须手动将一些东西传递到 Checkbox 的 checked 属性中。如果我不这样做,那么我就不能使用 setState。如果我尝试这样做,则复选框的可视组件不会更新。例如。我单击复选框,它保持为空。 我的第一个问题是为什么?为什么我不能将其保留为不受控制的组件?为什么我必须将一些东西传递给 checked 道具?

    <Checkbox
    label="1"
    style={styles.checkbox}
    onCheck={this.handleCheck.bind(this)}
    checked={this.state.box1} // if this is not supplied then I cannot use setState within handleCheck()

handleCheck():

  handleCheck(event, checked) {
    this.setState({
        box1: checked 
        someState: someValue 
    });
 }

现在我有多个复选框,所以我的第二个问题是,我如何构建它以使其尽可能干净?我是否需要为每个带有单独 handleCheck() 函数的复选框设置一个单独的状态变量? 我觉得那样很快就会变得混乱。例如(box1、box2、box3 等的状态)

Will I need to have a separate state variable for each checkbox?

是的,但不需要很麻烦。它可以是对应于特定复选框的 id 数组。

Will I need to have a separate handleCheck() functions?

当然不是,一个函数就可以了。只需传递 id 即可。

这是一个假设您有可变数量的复选框的示例:

handleCheck(id) {
  let found = this.state.activeCheckboxes.includes(id)
  if (found) {
    this.setState({ 
      activeCheckboxes: this.state.activeCheckboxes.filter(x => x !== id)
    })
  } else {
    this.setState({ 
      activeCheckboxes: [ ...this.state.activeCheckboxes, id ]
    })
  }
}

render() {
  return (
    <div>
      {this.state.aBunchOfCheckboxes.map(checkbox =>
        <Checkbox
          label={checkbox.label}
          onCheck={() => this.handleCheck(checkbox.id)}
          checked={this.state.activeCheckboxes.includes(id)}
        />
      }
    </div>
  )
}

My first question is why? Why can't I keep this as an uncontrolled component? Why must I pass something into the checked prop?

checkbox需要checked 属性来决定checkbox是否被选中。当 checked 收到 true 时,复选框显示为已选中,而当它收到 false 时,则保持未选中状态。如果你不传入一个值,它怎么知道是显示选中的复选框还是未选中的复选框?