当前位置:首页 > 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如何衰减

react如何衰减

React 中的动画衰减效果实现 在 React 中实现衰减效果(如滚动衰减、拖动释放后的惯性滑动)通常需要结合物理动画原理或第三方动画库。以下是几种常见方法: 使用 CSS 动画和 @keyfra…

如何构建react

如何构建react

构建 React 项目的步骤 安装 Node.js 和 npm 确保系统已安装 Node.js(包含 npm)。可通过命令行验证: node -v npm -v 使用 Create React Ap…

react如何通信

react如何通信

React 组件通信方式 React 组件间的通信方式多样,具体选择取决于组件关系和场景需求。以下是常见方法: 父子组件通信 父组件通过 props 向子组件传递数据,子组件通过回调函数通知父组件…

java如何react

java如何react

在Java中使用React 要在Java项目中集成React,通常需要将React前端与Java后端结合使用。以下是几种常见的方法: 使用Spring Boot作为后端 Spring Boot是一个…

webstorm如何运行react

webstorm如何运行react

运行 React 项目的方法 在 WebStorm 中运行 React 项目需要确保项目已正确配置,并且依赖项已安装。以下是具体操作步骤: 确保项目依赖已安装 打开终端(Terminal),导航到项…

react如何引用jquery

react如何引用jquery

在React项目中引用jQuery可以通过以下方法实现: 安装jQuery依赖 通过npm或yarn安装jQuery包: npm install jquery # 或 yarn add jquer…