当前位置:首页 > React

react在table实现全选

2026-01-27 15:12:00React

实现全选功能的基本思路

在React中实现表格全选功能,通常需要结合状态管理(如useState)和事件处理。全选逻辑的核心是维护一个选中状态的数组或对象,通过复选框的联动控制实现批量操作。

定义表格数据与选中状态

使用useState分别存储表格数据和选中状态。选中状态可以是数组(记录行索引)或对象(以ID为键的键值对),根据实际需求选择。

react在table实现全选

const [data, setData] = useState([
  { id: 1, name: 'Item 1' },
  { id: 2, name: 'Item 2' },
  { id: 3, name: 'Item 3' }
]);
const [selectedRows, setSelectedRows] = useState([]);

全选复选框的事件处理

全选复选框需要处理两个逻辑:点击时选中/取消所有行;根据当前行选中状态自动更新全选复选框的indeterminate状态。

const handleSelectAll = (e) => {
  if (e.target.checked) {
    setSelectedRows(data.map(item => item.id));
  } else {
    setSelectedRows([]);
  }
};

const isAllSelected = selectedRows.length === data.length;
const isIndeterminate = selectedRows.length > 0 && selectedRows.length < data.length;

单行复选框的事件处理

单个行复选框需要处理选中/取消逻辑,并同步更新全选状态。

react在table实现全选

const handleRowSelect = (id, e) => {
  if (e.target.checked) {
    setSelectedRows([...selectedRows, id]);
  } else {
    setSelectedRows(selectedRows.filter(rowId => rowId !== id));
  }
};

渲染表格与复选框

在表格结构中实现全选复选框与行复选框的联动。全选复选框的状态由isAllSelectedisIndeterminate控制。

<table>
  <thead>
    <tr>
      <th>
        <input
          type="checkbox"
          checked={isAllSelected}
          onChange={handleSelectAll}
          ref={el => el && (el.indeterminate = isIndeterminate)}
        />
      </th>
      <th>Name</th>
    </tr>
  </thead>
  <tbody>
    {data.map(item => (
      <tr key={item.id}>
        <td>
          <input
            type="checkbox"
            checked={selectedRows.includes(item.id)}
            onChange={(e) => handleRowSelect(item.id, e)}
          />
        </td>
        <td>{item.name}</td>
      </tr>
    ))}
  </tbody>
</table>

性能优化建议

对于大数据量表格,避免直接使用数组.includes()方法判断选中状态,改用Set或对象存储选中状态以提高性能。

const [selectedRows, setSelectedRows] = useState(new Set());

const handleSelectAll = (e) => {
  const newSelected = e.target.checked 
    ? new Set(data.map(item => item.id)) 
    : new Set();
  setSelectedRows(newSelected);
};

const handleRowSelect = (id, e) => {
  const newSelected = new Set(selectedRows);
  e.target.checked ? newSelected.add(id) : newSelected.delete(id);
  setSelectedRows(newSelected);
};

完整代码示例

import React, { useState } from 'react';

function SelectableTable() {
  const [data, setData] = useState([
    { id: 1, name: 'Item 1' },
    { id: 2, name: 'Item 2' },
    { id: 3, name: 'Item 3' }
  ]);
  const [selectedRows, setSelectedRows] = useState(new Set());

  const handleSelectAll = (e) => {
    const newSelected = e.target.checked 
      ? new Set(data.map(item => item.id)) 
      : new Set();
    setSelectedRows(newSelected);
  };

  const handleRowSelect = (id, e) => {
    const newSelected = new Set(selectedRows);
    e.target.checked ? newSelected.add(id) : newSelected.delete(id);
    setSelectedRows(newSelected);
  };

  const isAllSelected = selectedRows.size === data.length;
  const isIndeterminate = selectedRows.size > 0 && selectedRows.size < data.length;

  return (
    <table>
      <thead>
        <tr>
          <th>
            <input
              type="checkbox"
              checked={isAllSelected}
              onChange={handleSelectAll}
              ref={el => el && (el.indeterminate = isIndeterminate)}
            />
          </th>
          <th>Name</th>
        </tr>
      </thead>
      <tbody>
        {data.map(item => (
          <tr key={item.id}>
            <td>
              <input
                type="checkbox"
                checked={selectedRows.has(item.id)}
                onChange={(e) => handleRowSelect(item.id, e)}
              />
            </td>
            <td>{item.name}</td>
          </tr>
        ))}
      </tbody>
    </table>
  );
}

export default SelectableTable;

标签: 全选react
分享给朋友:

相关文章

react moment如何使用

react moment如何使用

安装 react-moment 通过 npm 或 yarn 安装 react-moment: npm install react-moment 或 yarn add react-moment 基本…

react如何动画

react如何动画

React 动画实现方法 React 中实现动画可以通过多种方式,包括原生 CSS、第三方库或 React 内置的动画解决方案。以下是几种常见方法: 使用 CSS 动画和过渡 通过 CSS 的 tr…

react 如何调试

react 如何调试

调试 React 应用的方法 使用 React Developer Tools 安装 Chrome 或 Firefox 的 React Developer Tools 扩展,可以检查组件树、状态和 p…

react如何减少伤病

react如何减少伤病

减少React应用中的性能问题(避免"伤病") 优化React应用性能需要从组件渲染、状态管理和外部依赖等多方面入手。以下是关键优化策略: 使用React.memo进行组件记忆 对函数组件使用Rea…

如何读react源码

如何读react源码

理解React源码的结构 React源码托管在GitHub上,主要分为几个核心模块:react、react-dom、react-reconciler等。react包包含核心API和组件逻辑,react…

vscode如何配置react

vscode如何配置react

配置 VSCode 进行 React 开发 安装必要插件 ES7+ React/Redux/React-Native snippets:提供 React 代码片段快速生成功能。 Prettier -…