【问题标题】:React js select all checkboxes not in react tableReact js选择所有不在反应表中的复选框
【发布时间】:2020-03-04 22:11:55
【问题描述】:

如果数据集中有任何布尔字段并且我没有使用 react-table,我可以通过什么方式选中/取消选中所有复选框?对于单个复选框正在工作,但并非对所有人都有效。谢谢你的任何提示。我将复选框命名为表中数据的对应名称,但它不起作用。

这是我的课:

class Boxes extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            datas: [
                {name: "name1", status: 1},
                {name: "name3", status: 0},
                {name: "name2", status: 2},
            ],
            checkboxes: [],
            selectAll: true,
        };
        this.toggleAllChange = this.toggleAllChange.bind(this);
        this.toggleOneChange = this.toggleOneChange.bind(this);
    }

  toggleAllChange(event) {
    let checked = event.target.checked;
    console.log(checked);

    this.setState({
      checkAll: checked,
      checkboxes: document.getElementsByClassName("chbx")
    });

    for (let i in this.state.checkboxes){
      let nameAct = this.state.checkboxes.item(i).name;
      let checkbox = document.getElementsByName(nameAct);
      this.setState({
         [nameAct]: checked
      });
    }
  }

toggleOneChange(event) {
    const target = event.target;
    const value = target.checked;
    const name = target.name;

    this.setState({
      [name]: value
    });
}

还有我在渲染方法中的表格:

<div className="input-group mb-3">
    <InputGroup className="mb-3">
        <input
            type="checkbox"
            value="checkAll"
            defaultChecked={this.state.selectAll}
            onChange={this.toggleAllChange.bind(this)}/>
        Check/Uncheck All
    </InputGroup>
</div>
<Table responsive>
    <thead className="text-primary">
    <tr>
        <th>Data name</th>
        <th>Data status</th>
        <th>Check</th>
    </tr>
    </thead>
    <tbody>
    {this.state.datas.map(data => (
        <tr>
            <td>{data.name}</td>
            <td>{data.status}</td>
            <td>
                <input
                    className="chbx"
                    type="checkbox"
                    id={"chbx" + data.name}
                    name={"chbx" + data.name}
                    defaultChecked={this.state.selectAll}
                    onChange={this.toggleOneChange.bind(this)}
                />
            </td>
        </tr>
    ))}
    </tbody>
</Table>

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    看下面的例子,我已经:

    • 使用对象checkBoxObj 管理复选框的状态
    • 使用checked 属性代替defaultCheckedcheckBoxObj
    <input
      className="chbx"
      type="checkbox"
      id={"chbx" + data.name}
      name={"chbx" + data.name}
      checked={this.state.checkBoxObj["chbx" + data.name]}
      onChange={this.toggleOneChange.bind(this)}
    />
    
    
    • 更改toggleAllChangetoggleOneChange 方法

    实例:

    const datas = [
        {name: "name1", status: 1},
        {name: "name3", status: 3},
        {name: "name2", status: 2},
    ];
    const selectAll = true;
    const checkBoxObj = datas.reduce((acc, d) => (acc["chbx" + d.name] = selectAll, acc), {});
    
    class Boxes extends React.Component {
      constructor(props) {
          super(props);
          this.state = {
              datas,
              //allChecked: true,
              selectAll,
              checkBoxObj,
          };
          this.toggleAllChange = this.toggleAllChange.bind(this);
          this.toggleOneChange = this.toggleOneChange.bind(this);
      }
    
      toggleAllChange(event) {
          const selectAll = event.target.checked;
          
          const newCheckBoxObj = {};
          for(let k in this.state.checkBoxObj) {
            newCheckBoxObj[k] = selectAll;
          }
    
          this.setState({
              checkBoxObj: newCheckBoxObj,
              selectAll
          });
      }
    
      toggleOneChange(event) {
          const target = event.target;
          const value = target.checked;
          const name = target.name;
          
          const newCheckBoxObj = { ...this.state.checkBoxObj, [name]: value };
          
          const selectAll = Object.values(newCheckBoxObj).every(chk => chk);
          
      
          this.setState({
            checkBoxObj: newCheckBoxObj,
            selectAll
          });
      }
      
      render() {
        const filteredDatas = this.state.datas;
        return (
          <div>
            <div className="input-group mb-3">
                    <input
                        type="checkbox"
                        value="checkAll"
                        style={{ marginRight: 5 }}
                        checked={this.state.selectAll}
                        onChange={this.toggleAllChange.bind(this)}
                    />{" "}
                    Check/Uncheck All
            </div>
            <table responsive>
                <thead className="text-primary">
                <tr>
                    <th>Data name</th>
                    <th>Data status</th>
                    <th>Check</th>
                </tr>
                </thead>
                <tbody>
                {filteredDatas.map(data => (
                    <tr>
                        <td>{data.name}</td>
                        <td>{data.status}</td>
                        <td>
                            <input
                                className="chbx"
                                type="checkbox"
                                id={"chbx" + data.name}
                                name={"chbx" + data.name}
                                checked={this.state.checkBoxObj["chbx" + data.name]}
                                onChange={this.toggleOneChange.bind(this)}
                            />
                        </td>
                    </tr>
                ))}
                </tbody>
            </table>
          </div>)
      }
    
    }
    
    ReactDOM.render(<Boxes />, document.getElementById('root'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
    <div id="root"></div>

    【讨论】:

    • 谢谢!工作中!但是2个问题? 1.当我取消选中表格中的一个复选框时,选中/取消选中所有未更改,如何修复? 2.如何设置table中所有小复选框的默认checked:true?
    • 对于第二个问题,我在声明类 const checkBoxObj = datas.reduce((acc, d) =&gt; (acc["chbx" + d.name] = selectAll, acc), {}); 之前使用 reduce 初始化复选框
    • 太棒了!非常感谢!
    • 还有一个问题:我想指出每个数据元素的检查状态,为什么下面这个方法不起作用? doMethod = datas => { datas.map(data => { let checked = this.state.checkBoxObj.filter(cb => cb.name === ("chbx" + data.name)).checked; if (checked ) { //代码 } }); };
    • 但我需要循环数据并为每一行检查复选框是否被过滤。我只能按名称匹配行和复选框,但是以什么方式?
    猜你喜欢
    • 1970-01-01
    • 2019-05-20
    • 2019-07-10
    • 1970-01-01
    • 2019-10-15
    • 2017-06-12
    • 2015-12-14
    • 2020-01-11
    • 2020-08-28
    相关资源
    最近更新 更多