antd 库的 Table 组件中删除一个或多个选中的列表

文章介绍了如何在React应用中使用useState管理状态,实现表格的行选择和清空/删除功能。重点展示了如何通过`selectedRowKeys`和`onChange`控制选中项,以及使用`filter`和`includes`方法动态过滤数据以实现删除选中行的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

先解释一下原代码每个方法的含义


const TablePage: React.FC = () => {
  /* 
    selectedRowKeys	指定选中项的 key 数组,需要和 onChange 进行配合
    在此处,通过 rowSelection.selectedRowKeys 来控制选中项。
    */
  const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);
  // loading 页面是否加载中
  const [loading, setLoading] = useState(false);

  // 点击了清空
  const start = () => {
    setLoading(true);
    // ajax request after empty completing
    setTimeout(() => {
      setSelectedRowKeys([]);
      setLoading(false);
    }, 1000);
  };

  // onSelectChange 触发了选择改变
  const onSelectChange = (newSelectedRowKeys: React.Key[]) => {
    console.log("selectedRowKeys changed: ", newSelectedRowKeys);
    setSelectedRowKeys(newSelectedRowKeys);
  };

  // 开启可选则按钮
  const rowSelection = {
    selectedRowKeys,
    onChange: onSelectChange,
  };

  //禁用
  const hasSelected = selectedRowKeys.length > 0;

  // 删除
  const deleteList = () => {
    console.log(selectedRowKeys);
    const dataVale = data.filter((item) => !selectedRowKeys.includes(item.key));

    console.log(dataVale);
  };
  return (
    <div>
      <div style={{ marginBottom: 16 }}>
        <Button
          type="primary"
          onClick={start}
          disabled={!hasSelected}
          loading={loading}
        >
          清空
        </Button>{" "}
        &nbsp;
        <Button onClick={deleteList}>删除</Button>
        <span style={{ marginLeft: 8 }}>
          {hasSelected ? `你选择了 ${selectedRowKeys.length}` : ""}
        </span>
      </div>
      {/* 
      rowSelection :表格行是否可选择,配置项
      columns	表格列的配置描述
      dataSource	数据数组
      */}
      <Table rowSelection={rowSelection} columns={columns} dataSource={data} />
    </div>
  );
};

修改后的数据,重新定义了 data

  const [data, setData] = useState([
    { key: "t", name: "唐诗", age: 18, address: "唐朝" },
    { key: "s", name: "宋词", age: 18, address: "宋朝" },
    { key: "y", name: "元曲", age: 18, address: "元朝" },
    { key: "m", name: "明文", age: 18, address: "明朝" },
    { key: "q", name: "清小说", age: 18, address: "清朝" },
  ]);

添加删除按钮

在原有的 选择和操作 用法上先添加一个删除按钮

 <Button onClick={deleteList}>删除</Button>

删除按钮的方法

  // 删除
  const deleteList = () => {
    console.log(selectedRowKeys);
    const dataVale = data.filter((item) => !selectedRowKeys.includes(item.key));
    setData(dataVale);
    console.log(dataVale);
  };

解析一下这行代码:

data.filter((item) => !selectedRowKeys.includes(item.key));

代码使用了filterincludes两种数组方法来创建新的newData数组。

首先,来分析一下这行代码的整体逻辑:

  1. filter方法用于遍历原始的data数组,并根据指定条件对数组元素进行筛选。
  2. 在每次遍历数组元素时,通过!selectedRowKeys.includes(item.key)来判断该元素的key属性是否存在于selectedRowKeys数组中。
  3. 如果item.keyselectedRowKeys数组中不存在(即includes返回false),则该元素会被保留在newData数组中。
  4. 最后,newData数组会包含筛选后的结果,即不包含选中行的新的数据数组。

分别解释一下filterincludes的作用:

  1. filter方法是一个高阶函数,接受一个回调函数作为参数。回调函数会遍历数组中的每个元素,并根据返回值来决定是否保留该元素。若返回值为true,则保留该元素;若返回值为false,则舍弃该元素。
  2. includes方法用于判断数组是否包含某个指定元素。它接受一个参数作为要搜索的元素,并返回一个布尔值。如果指定的元素存在于数组中,返回true;反之,返回false

因此,const newData = data.filter(item => !selectedRowKeys.includes(item.key)); 这行代码的作用是从data数组中过滤出那些item.keyselectedRowKeys数组中不存在的元素,然后赋值给newData数组,实现了删除选中行的效果。

完整代码:

import React, { useState } from "react";
import { Button, Table } from "antd";
import type { ColumnsType } from "antd/es/table";

interface DataType {
  key: React.Key;
  name: string;
  age: number;
  address: string;
}

const columns: ColumnsType<DataType> = [
  {
    title: "Name",
    dataIndex: "name",
  },
  {
    title: "Age",
    dataIndex: "age",
  },
  {
    title: "Address",
    dataIndex: "address",
  },
  {
    title: "Controls",
    dataIndex: "Controls",
    render: () => <Button>显示</Button>,
  },
];

// for (let i = 6; i < 46; i++) {
//   data.push({
//     key: i,
//     name: `Edward King ${i}`,
//     age: 32,
//     address: `London, Park Lane no. ${i}`,
//   });
// }

const TablePage: React.FC = () => {
  /* 
    selectedRowKeys	指定选中项的 key 数组,需要和 onChange 进行配合
    在此处,通过 rowSelection.selectedRowKeys 来控制选中项。
    */
  const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);
  // loading 页面是否加载中
  const [loading, setLoading] = useState(false);

  const [data, setData] = useState([
    { key: "t", name: "唐诗", age: 18, address: "唐朝" },
    { key: "s", name: "宋词", age: 18, address: "宋朝" },
    { key: "y", name: "元曲", age: 18, address: "元朝" },
    { key: "m", name: "明文", age: 18, address: "明朝" },
    { key: "q", name: "清小说", age: 18, address: "清朝" },
  ]);

  // 点击了清空
  const start = () => {
    setLoading(true);
    // ajax request after empty completing
    setTimeout(() => {
      setSelectedRowKeys([]);
      setLoading(false);
    }, 1000);
  };

  // onSelectChange 触发了选择改变
  const onSelectChange = (newSelectedRowKeys: React.Key[]) => {
    console.log("selectedRowKeys changed: ", newSelectedRowKeys);
    setSelectedRowKeys(newSelectedRowKeys);
  };

  // 开启可选则按钮
  const rowSelection = {
    selectedRowKeys,
    onChange: onSelectChange,
  };

  //禁用
  const hasSelected = selectedRowKeys.length > 0;

  // 删除
  const deleteList = () => {
    console.log(selectedRowKeys);
    const dataVale = data.filter((item) => !selectedRowKeys.includes(item.key));
    setData(dataVale);
    console.log(dataVale);
  };
  return (
    <div>
      <div style={{ marginBottom: 16 }}>
        <Button
          type="primary"
          onClick={start}
          disabled={!hasSelected}
          loading={loading}
        >
          清空
        </Button>{" "}
        &nbsp;
        <Button onClick={deleteList}>删除</Button>
        <span style={{ marginLeft: 8 }}>
          {hasSelected ? `你选择了 ${selectedRowKeys.length}` : ""}
        </span>
      </div>
      {/* 
      rowSelection :表格行是否可选择,配置项
      columns	表格列的配置描述
      dataSource	数据数组
      */}
      <Table rowSelection={rowSelection} columns={columns} dataSource={data} />
    </div>
  );
};

export default TablePage;


### 实现两个 Ant Design Table 表格共享同一个全选系统的方案 为了使两个 `Ant Design Vue` 的表格组件能够共用一个全选功能并实现联动效果,可以采用以下方法: #### 数据绑定与状态管理 通过 Vuex Reactivity API(Vue 3 中的 Composition API),将两表的状态统一到父级组件中进行集中管理。这样可以通过单一的数据源控制多个组件的行为。 以下是具体实现方式: --- #### 使用 Vue 3 的 Ref 和 Reactive 进行数据同步 创建一个共同使用的数组来存储被选中的项,并将其作为 props 传递给两个表格组件。当任意一张表格触发全选者单选事件时,更新这个公共数组即可自动影响另一张表格选择状态[^1]。 ```vue <template> <div> <!--一个表格 --> <a-table :row-selection="rowSelection" :columns="columns" :data-source="dataSource"></a-table> <!-- 第二个表格 --> <a-table :row-selection="rowSelection" :columns="columns" :data-source="anotherDataSource"></a-table> </div> </template> <script> import { reactive, toRefs } from 'vue'; export default { setup() { const state = reactive({ selectedRowKeys: [], // 被选中的 key 列表 allData: [] // 所有可选项列表 (用于判断是否全部勾选) }); const rowSelection = { onChange(selectedKeys) { state.selectedRowKeys = [...selectedKeys]; }, getCheckboxProps(record) { return { disabled: !state.allData.includes(record.key), }; } }; return { ...toRefs(state), columns: [ { title: 'Name', dataIndex: 'name' }, { title: 'Age', dataIndex: 'age' } ], dataSource: [{key:'1', name:"John", age:20}, {key:'2', name:"Doe", age:25}], anotherDataSource: [{key:'3', name:"Jane", age:30}, {key:'4', name:"Smith", age:35}], rowSelection, }; } }; </script> ``` 上述代码片段展示了如何利用 Vue 的响应式特性,在两张表格之间共享同一组已选择记录的信息。每当任一表格发生改变时,都会重新设置全局变量 `selectedRowKeys` 来反映最新的选择情况。 --- #### 功能扩展:支持跨页码全选逻辑 如果涉及到分页场景,则需额外考虑加载更多页面后的处理机制。可以在初始化阶段预取所有可能存在的条目 ID 并存入 `allData` 数组内;之后无论在哪一页执行操作均能正确映射至对应实体上。 例如: - 当前显示第一页共有十条数据; - 用户点击第二页后继续保留之前所做标记而无需重复选取动作。 这种设计模式不仅提升了用户体验一致性同时也简化了开发流程复杂度。 --- #### 总结 综上所述,借助 Vue 提供的强大工具集——尤其是其独特的反应体系结构——我们可以轻松达成多实例间资源共享的目标。对于本案例而言就是实现了双 ATable 控件间的无缝协作关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值