【问题标题】:In React-Table, how to check/uncheck all checkboxes in a row or column在 React-Table 中,如何选中/取消选中行或列中的所有复选框
【发布时间】:2025-12-29 00:45:10
【问题描述】:

我有一个使用react-table 的表格,其中包含行中的复选框。 我还在一行的第一个单元格中添加了一个“选中所有”复选框,以选中/取消选中该行每一列中的所有复选框。

问题是当我实现“全选”复选框时,它按预期工作,但是当我单独选中/取消选中一个复选框时,它不会选中/取消选中 .

表格组件

import React from 'react';
import ReactTable from 'react-table';
import setTableColumns from '../utils/setTableColumns';

const RolePermissionsTable = () => {
  return (
    <ReactTable
      defaultPageSize={10}
      data={capacity.roles}
      columns={setTableColumns()}
      showPagination={false}
      getTrProps={(state, rowData, column, instance) => {
        return {
          onClick(event) {
            const row = event.currentTarget;
            const targetEntity = row.querySelector(
              '.RoleTarget [type="checkbox"]'
            );
            const allCheckboxes = Array.prototype.slice.call(
              row.querySelectorAll('[type="checkbox"]')
            );
            const permissionsCheckboxes = allCheckboxes.slice(
              1,
              allCheckboxes.length
            );
            const isChecked = targetEntity.checked;

            permissionsCheckboxes.map(permissionsCheckbox => {
              permissionsCheckbox.checked = isChecked ? isChecked : null;
            });
          },
        };
      }}
    />
  );
};

列标题

import React from 'react';

// imported above for the table
const setTableColumns = () => {
  return [
    {
      Header: 'Entities',
      accessor: 'target',
      Cell: rowData => (
        <span className="RoleTarget" key={rowData.original.target}>
          <input
            id={`CheckAll-${rowData.original.target}`}
            type="checkbox"
          />
          <span className="RoleTarget__name">{rowData.original.target}</span>
        </span>
      ),
    },
    {
      Header: 'Add',
      accessor: 'add',
      Cell: rowData => {
        return (
          <input
            type="checkbox"
            defaultChecked={rowData.original.permissions.add}
            id={`${rowData.original.target}-${rowData.original.userId}`}
          />
        );
      },
    },
    {
      Header: 'Modify',
      accessor: 'modify',
      Cell: rowData => {
        return (
          <input
            type="checkbox"
            defaultChecked={rowData.original.permissions.modify}
            id={`${rowData.original.target}-${rowData.original.userId}`}
          />
        );
      },
    },
    {
      Header: 'Delete',
      accessor: 'delete',
      Cell: rowData => {
        return (
          <input
            type="checkbox"
            defaultChecked={rowData.original.permissions.delete}
          />
        );
      },
    },
  ];
};

我不确定我这样做是否正确,或者有更好的方法吗?

非常感谢

【问题讨论】:

    标签: javascript html reactjs checkbox react-table


    【解决方案1】:

    我不想说是否有“更好的方法”,如果您的解决方案解决了您的问题,那已经很好了。我确实认为有一个更简单的方法。 有一个简单的包可以解决这个问题grouped-checkboxes

    View on codesandbox

    在你的情况下,它看起来像这样:

    import React from 'react';
    import ReactTable, { ReactTableDefaults } from 'react-table';
    import setTableColumns from '../utils/setTableColumns';
    import { CheckboxGroup } from '@createnl/grouped-checkboxes';
    
    const TrComponent = ({ children, ...rest }) => (
     <tr {...rest}>
       <CheckboxGroup>{children}</CheckboxGroup>
     </tr>
    );
    
    const RolePermissionsTable = () => {
      Object.assign(ReactTableDefaults, {
        TrComponent: TrComponent
      });
    
      return (
        <ReactTable
          defaultPageSize={10}
          data={capacity.roles}
          columns={setTableColumns()}
          showPagination={false}
        />
      );
    

    列标题

    import React from 'react';
    import { AllCheckerCheckbox, Checkbox } from '@createnl/grouped-checkboxes';
    
    // imported above for the table
    const setTableColumns = () => {
      return [
        {
          Header: 'Entities',
          accessor: 'target',
          Cell: rowData => (
            <span className="RoleTarget" key={rowData.original.target}>
              <AllCheckerCheckbox
                id={`CheckAll-${rowData.original.target}`}
              />
              <span className="RoleTarget__name">{rowData.original.target}</span>
            </span>
          ),
        },
        {
          Header: 'Add',
          accessor: 'add',
          Cell: rowData => {
            return (
              <Checkbox
                checked={rowData.original.permissions.add}
                id={`${rowData.original.target}-${rowData.original.userId}`}
              />
            );
          },
        },
        {
          Header: 'Modify',
          accessor: 'modify',
          Cell: rowData => {
            return (
              <Checkbox
                checked={rowData.original.permissions.modify}
                id={`${rowData.original.target}-${rowData.original.userId}`}
              />
            );
          },
        },
        {
          Header: 'Delete',
          accessor: 'delete',
          Cell: rowData => {
            return (
              <Checkbox
                checked={rowData.original.permissions.delete}
              />
            );
          },
        },
      ];
    };
    

    【讨论】:

    • 感谢您的回复。您的解决方案有效,但它会检查表格上的每个复选框。我想要的是,它应该只选中/取消选中与 checkAll 复选框在同一行上的所有复选框。我如何使用grouped-checkboxes 模块做到这一点?
    • 嗨 SeyAde,我已经更新了代码并添加了一个代码框供您使用。我覆盖了默认的 tr 组件并向其添加了一个复选框组。也不要忘记将 defaultChecked 更改为选中。有关覆盖组件的更多信息:github.com/tannerlinsley/react-table/tree/…
    • 现在可以使用了。感谢 Alexej 的帮助!这是您正在开发以公开发布的 React 模块吗?