当前位置:首页 > React

react-antd实现全选

2026-01-27 16:22:39React

使用 React 和 Ant Design 实现全选功能

实现全选功能的核心是结合 Ant Design 的 TableCheckbox 组件

基础实现方法

  1. 准备数据与状态管理 在组件中定义数据源和选中状态:

    const [data, setData] = useState([
      { id: 1, name: 'Item 1' },
      { id: 2, name: 'Item 2' },
      { id: 3, name: 'Item 3' }
    ]);
    const [selectedRowKeys, setSelectedRowKeys] = useState([]);
  2. 配置 Table 的 rowSelection 使用 Ant Design Table 的 rowSelection 属性:

    const rowSelection = {
      selectedRowKeys,
      onChange: (selectedKeys) => {
        setSelectedRowKeys(selectedKeys);
      },
      getCheckboxProps: (record) => ({
        disabled: record.disabled // 可选:禁用某些行的选择
      })
    };
    
    <Table
      rowSelection={rowSelection}
      dataSource={data}
      columns={columns}
      rowKey="id"
    />
  3. 添加全选控制按钮 在表格上方添加控制全选的 Checkbox:

    const onSelectAll = (e) => {
      if (e.target.checked) {
        setSelectedRowKeys(data.map(item => item.id));
      } else {
        setSelectedRowKeys([]);
      }
    };
    
    <Checkbox
      checked={selectedRowKeys.length === data.length}
      indeterminate={selectedRowKeys.length > 0 && selectedRowKeys.length < data.length}
      onChange={onSelectAll}
    >
      全选
    </Checkbox>

高级实现技巧

  1. 分页全选处理 对于分页表格,需要额外处理跨页全选逻辑:

    const [allSelectedKeys, setAllSelectedKeys] = useState([]);
    
    const handleSelectAll = (e) => {
      if (e.target.checked) {
        const currentPageKeys = data.map(item => item.id);
        setAllSelectedKeys([...new Set([...allSelectedKeys, ...currentPageKeys])]);
        setSelectedRowKeys(currentPageKeys);
      } else {
        setAllSelectedKeys(allSelectedKeys.filter(key => !data.some(item => item.id === key)));
        setSelectedRowKeys([]);
      }
    };
  2. 带筛选条件的全选 当表格有筛选条件时,全选应只针对当前筛选结果:

    const [filteredData, setFilteredData] = useState(data);
    
    const onSelectAllFiltered = (e) => {
      if (e.target.checked) {
        setSelectedRowKeys(filteredData.map(item => item.id));
      } else {
        setSelectedRowKeys(selectedRowKeys.filter(key => 
          !filteredData.some(item => item.id === key)
        ));
      }
    };
  3. 性能优化 对于大数据量表格,使用 memoization 优化性能:

    react-antd实现全选

    const rowSelection = useMemo(() => ({
      selectedRowKeys,
      onChange: setSelectedRowKeys,
      preserveSelectedRowKeys: true
    }), [selectedRowKeys]);

完整示例代码

import React, { useState, useMemo } from 'react';
import { Table, Checkbox } from 'antd';

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

  const [selectedRowKeys, setSelectedRowKeys] = useState([]);

  const columns = [
    { title: 'ID', dataIndex: 'id' },
    { title: 'Name', dataIndex: 'name' }
  ];

  const rowSelection = useMemo(() => ({
    selectedRowKeys,
    onChange: setSelectedRowKeys
  }), [selectedRowKeys]);

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

  return (
    <div>
      <Checkbox
        checked={selectedRowKeys.length === data.length}
        indeterminate={selectedRowKeys.length > 0 && selectedRowKeys.length < data.length}
        onChange={onSelectAll}
      >
        全选
      </Checkbox>

      <Table
        rowSelection={rowSelection}
        dataSource={data}
        columns={columns}
        rowKey="id"
      />
    </div>
  );
};

export default SelectableTable;

注意事项

  • 确保为每条数据设置了唯一的 rowKey 属性
  • 处理分页数据时需要额外考虑跨页选择逻辑
  • 大数据量情况下考虑使用虚拟滚动或分页加载优化性能
  • 当表格有筛选或排序功能时,全选操作应只针对当前显示的数据

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

相关文章

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 在项目根目录的 package.json 文件中查看 dependencies 或 devDependencies 下的 react 和…

如何下载react

如何下载react

下载 React 的方法 通过 npm 或 yarn 安装 React 可以通过包管理器 npm 或 yarn 安装。确保已安装 Node.js(包含 npm),然后在项目目录中运行以下命令:…

react如何读

react如何读

React 的发音 React 的发音为 /riˈækt/(音标),读作“瑞-艾克特”。其中: “Re” 发音类似英文单词 “read” 的开头部分。 “act” 发音与英文单词 “act” 一致。…

react如何diff

react如何diff

React Diff 算法原理 React 的 Diff 算法是 Virtual DOM 的核心部分,用于高效更新真实 DOM。其核心思想是通过对比新旧 Virtual DOM 树的差异,最小化 DO…

react如何动画

react如何动画

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

react如何同步

react如何同步

React 同步状态管理方法 在 React 中实现同步状态管理,可以通过以下多种方式实现: 使用 useState 和 useEffect 钩子 通过 useState 定义状态,使用 useEf…