【问题标题】:How to select group based checkbox antd in reactjs如何在reactjs中选择基于组的复选框antd
【发布时间】:2020-03-19 17:24:08
【问题描述】:

我想选择一个基于组的复选框。问题是当我点击组时,整个复选框被选中。我不想选择整个复选框。这是我的初始状态。

const plainOptions = ["can_view", "can_create", "can_update"];
state = {
  checkedList: [],
  indeterminate: true,
  checkAll: false
};

方法:onchange 方法基本上适用于每个单独的复选框。

onChange = checkedList => {
  console.log(checkedList);
  this.setState({
    checkedList,
    indeterminate:
      !!checkedList.length && checkedList.length < plainOptions.length,
    checkAll: checkedList.length === plainOptions.length
  });
};

此方法适用于选中的所有复选框

onCheckAllChange = e => {
  console.log(e.target.checked);
  this.setState({
    checkedList: e.target.checked ? plainOptions : [],
    indeterminate: false,
    checkAll: e.target.checked
  });
};
{
  ["group", "topGroup"].map(item => (
    <div className="site-checkbox-all-wrapper">
      <Checkbox
        indeterminate={this.state.indeterminate}
        onChange={this.onCheckAllChange}
        checked={this.state.checkAll}
      >
        {item}
      </Checkbox>
      <CheckboxGroup
        options={plainOptions}
        value={this.state.checkedList}
        onChange={this.onChange}
      />
    </div>
  ));
}

但是,我接受的数据格式是

{group:["can_view","can_create"],topGroup:["can_view","can_create"}

当用户选中复选框时,我想获得这种格式输出

这里是代码沙箱:https://codesandbox.io/s/agitated-sea-1ygqu

【问题讨论】:

  • 这能回答你的问题吗? stackoverflow.com/a/60612506/11872246
  • 你有没有检查我的代码在这里codesandbox.io/s/agitated-sea-1ygqu
  • “我想选择一个基于组的复选框。问题是当我点击组时,整个复选框都被选中了。我不想选择整个复选框。” 我不太确定我是否理解。是否要选中半个复选框?
  • 我想选择基于角色的复选框。例如,您单击组 - 它将选择组的第一行,如果您单击 topgroup ,它将选择基于 topgroup 的行。
  • 目前,当我在 group 上选择时,它会选择 include with topgroup 。当我在 group 上选择时,我不想选择 topgroup 。

标签: javascript arrays reactjs checkbox antd


【解决方案1】:

当您单击其中一个组时,两个组都发生变化的原因是两个组使用相同的内部状态。

["group", "topGroup"].map(item => (
  <div className="site-checkbox-all-wrapper">
    <Checkbox
      indeterminate={this.state.indeterminate}
      onChange={this.onCheckAllChange}
      checked={this.state.checkAll}
    >
      {item}
    </Checkbox>
    <CheckboxGroup
      options={plainOptions}
      value={this.state.checkedList}
      onChange={this.onChange}
    />
  </div>
));

grouptopGroup 使用相同的 this.state.checkList 状态。


解决此问题的最简单方法是将每个组提取到自己的组件中。这样他们就有了彼此独立的状态。


您也可以选择保留一个组件,但您必须管理多个内部状态。例如,您可以使用state = { checkList: [[], []] },其中第一个子数组用于存储group 状态,第二个子数组用于存储topGroup 状态。

如果组是动态的,您可以简单地 map 覆盖组并以这种方式创建您的状态:

state = { checkList: groups.map(() => []) };

您还需要管理多个indeterminatecheckAll 状态。当您从checkList 状态推断出这些时,可以避免这种情况。例如:

isIndeterminate(index) {
  const checkList = this.state.checkList[index];
  return checkList.length > 0 && checkList.length < plainOptions.length;
}

这也可以避免冲突状态,因为只有一个事实来源。

【讨论】:

  • 我怎样才能得到我接受的输出。你看起来 {group:["can_view","can_create"],topGroup:["can_view","can_create"}
  • 我想在用户单击复选框时添加新对象。例如,当用户点击 group 时,它将存储数据 {permission:{group:["1","2"]}}。如果我点击 topgroup ,它将与前一个对象一起存储新对象
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
相关资源
最近更新 更多