当前位置:首页 > 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
分享给朋友:

相关文章

vue实现全选

vue实现全选

Vue 实现全选功能 全选功能通常用于表格或列表中,允许用户一键选择所有项目。以下是几种实现方式: 使用 v-model 和计算属性 在数据中维护一个数组存储选中项的 ID,通过计算属性实现全选逻辑…

react native如何启动

react native如何启动

如何启动 React Native 项目 安装 Node.js 和 npm 确保已安装 Node.js(建议版本 16 或更高)和 npm(Node.js 自带)。可通过以下命令检查版本: nod…

react moment如何使用

react moment如何使用

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

react如何部署

react如何部署

部署 React 应用的常见方法 使用静态服务器部署 React 应用在构建后会生成静态文件,可以直接通过静态服务器部署。常用的静态服务器包括 Nginx、Apache 等。 运行构建命令生成静态…

react架构如何

react架构如何

React 架构核心概念 React 的架构围绕组件化、虚拟 DOM 和单向数据流设计。组件是构建用户界面的独立模块,分为函数组件和类组件。虚拟 DOM 通过高效的 Diff 算法减少直接操作真实 D…

react如何浮动

react如何浮动

使用 CSS 实现浮动 在 React 中实现浮动效果可以通过 CSS 的 float 属性完成。在组件的样式文件或内联样式中直接设置 float: left 或 float: right。…