react-antd-procomponents组件库 ProTable表格实现跨页多选。

在这里插入图片描述

table表格多选时所需要的api
1.onSelect - 单行选择(用户手动选择/取消选择某行的回调)
2.onSelectMultiple - 多行选择(用户使用键盘 shift 选择多行的回调)
3.onSelectAll - 全选全不选(用户手动选择/取消选择所有行的回调)
4.onChange - 每次选择行都会触发onChange,并且是后执行。(选中项发生变化时的回调)

cancleRowKeys - 取消选择的行
mySelectedRowKeys - 选中的行

1.选择行时,判断是选择还是取消选择,如果是取消选择,将行key存储至 cancleRowKeys 中

2.在onChange 方法中

  • 如果cancleRowKeys有值,说明此次选择是取消选择,从已选中的行mySelectedRowKeys过滤掉cancleRowKeys,并将cancleRowKeys重置为空
  • 如果cancleRowKeys没有值,将选中数据添加至mySelectedRowKeys,并清理重复数据

关键代码:

import { useState, useEffect, useRef } from 'react';
import { Button, Drawer, Space, Table, message } from 'antd';
import { RollbackOutlined } from '@ant-design/icons';
import { ProTable, ProFormTreeSelect } from '@ant-design/pro-components';
import type { FC } from 'react';
import type { DataType } from '../data';
import type { ProColumns, ActionType } from '@ant-design/pro-table';
import { getPersonnels, publishStudents } from '../service';
import { getCodeSelecBytybe } from '@/services/globalServices';
import { getFlatArr } from '../../../utils/utils';
export type DrawerProps = {
  currentRow: DataType | undefined;
  personnelVisible: boolean;
  handlePersonnelVisible: any;
  setCurrentRow: any;
  actionRef: any;
  managecomListData: any;
  initialManagecomValue: any;
  newTreeData: any;
};
const Personnel: FC<DrawerProps> = (props) => {
  const {
    currentRow,
    setCurrentRow,
    personnelVisible,
    handlePersonnelVisible,
    actionRef,
    managecomListData,
    initialManagecomValue,
    newTreeData,
  } = props;
  const actionRef2 = useRef<ActionType>(); // 表格组件ProTable ref
  const [userflagArray, setUserflagArray] = useState([]); // 用户类型
  useEffect(() => {
    // 用户类型
    getCodeSelecBytybe({ codeType: 'userflag' }).then((res) => {
      if (res && res.success) {
        setUserflagArray(res.data);
      } else {
        setUserflagArray([]);
      }
    });
  }, []);

  const [mySelectedRowKeys, handleMySelectedRowKeys] = useState([]); // 选中的项目
  // 由于cancleRowKeys不影响dom,所以不使用useState定义
  let cancleRowKeys = []; // 取消选择的项目

  const onSelect = (record, selected) => {
    if (!selected) {
      cancleRowKeys = [record.staffCode];
    }
  };

  const onMulSelect = (selected, selectedRows, changeRows) => {
    if (!selected) {
      cancleRowKeys = changeRows.map((item) => item.staffCode);
    }
  };

  const onChange = (selectedRowKeys, selectedRows) => {
    if (cancleRowKeys.length) {
      const keys = mySelectedRowKeys.filter((item) => !cancleRowKeys.includes(item));
      handleMySelectedRowKeys(keys);
      cancleRowKeys = [];
    } else {
      handleMySelectedRowKeys([...new Set(mySelectedRowKeys.concat(selectedRowKeys))]);
    }
  };

  // 重置
  const rest = () => {
    handlePersonnelVisible(false);
    setCurrentRow(undefined);
  };

  // 发布通知
  const releaseNotes = (selectedRowKeys: any) => {
    let params = {
      studentId: selectedRowKeys.toString(),
      noticeId: currentRow?.id,
    };
    publishStudents(params).then((res) => {
      if (res && res.success) {
        rest();
        if (actionRef.current) {
          actionRef.current.reload();
        }
        message.success('发布通知成功!');
      }
    });
  };

  const columns: ProColumns[] = [
    {
      title: '工号',
      dataIndex: 'staffCode',
      align: 'center',
    },
    {
      title: '姓名',
      dataIndex: 'name',
      align: 'center',
    },
    {
      title: '用户类型',
      dataIndex: 'userFlag',
      align: 'center',
      valueType: 'select',
      fieldProps: {
        options: userflagArray,
        fieldNames: {
          label: 'codeName',
          value: 'codeValue',
        },
      },
      render: (text: any) => {
        return text;
      },
    },
    {
      title: '管理机构',
      dataIndex: 'manageCom',
      align: 'center',
      renderFormItem: (item, { type }, form) => {
        if (type === 'form') {
          return null;
        } else {
          return (
            <div className="searchWidth">
              <ProFormTreeSelect
                placeholder="请选择"
                allowClear
                request={async () => newTreeData}
                fieldProps={{
                  showArrow: false,
                  filterTreeNode: true, // 根据输入项筛选
                  showSearch: true,
                  dropdownMatchSelectWidth: false, // 下拉菜单和选择器同宽。 默认true
                  treeNodeFilterProp: 'title',
                  fieldNames: {
                    label: 'title',
                  },
                  onChange: (e) => {
                    form.setFieldsValue({ manageCom: e });
                  },
                }}
              />
            </div>
          );
        }
      },
      render: (_: any, record: { manageCom: any }) => {
        let text2 = record.manageCom;
        Object.keys(getFlatArr(managecomListData)).map((index) => {
          if (getFlatArr(managecomListData)[index].value === record.manageCom) {
            text2 = getFlatArr(managecomListData)[index].title;
          }
          return text2;
        });
        return text2;
      },
    },
    {
      title: '入司日期',
      dataIndex: 'employDate',
      align: 'center',
      valueType: 'date',
      search: false,
    },
    {
      title: '电话',
      dataIndex: 'phone',
      align: 'center',
      search: false,
    },
  ];
  return (
    <>
      {currentRow ? (
        <Drawer
          title="发布通知公告"
          width="70%"
          onClose={() => rest()}
          visible={personnelVisible}
          maskClosable={false}
          closable={false}
          footer={
            <Button key="back" icon={<RollbackOutlined />} onClick={() => rest()}>
              返回
            </Button>
          }
        >
          <ProTable
            rowKey="staffCode"
            actionRef={actionRef2}
            search={{
              labelWidth: 120,
              defaultCollapsed: false,
            }}
            pagination={{
              pageSize: 10,
            }}
            options={false}
            revalidateOnFocus={false}
            request={(params) => getPersonnels({ ...params } as any)}
            columns={columns}
            rowSelection={{
              selectedRowKeys: mySelectedRowKeys,
              onSelect, //用户手动选择/取消选择某行的回调
              onSelectMultiple: onMulSelect, //用户使用键盘 shift 选择多行的回调
              onSelectAll: onMulSelect, //用户手动选择/取消选择所有行的回调
              onChange, //选中项发生变化时的回调
            }}
            tableAlertRender={() => {
              return (
                <Space size={24}>
                  <Button
                    type="primary"
                    key="primarynew"
                    onClick={() => {
                      releaseNotes(mySelectedRowKeys);
                    }}
                  >
                    发布通知({mySelectedRowKeys.length})
                  </Button>
                  <span>
                    {/* <a style={{ marginInlineStart: 8 }} onClick={onCleanSelected}>
                      取消选择
                    </a> */}
                  </span>
                </Space>
              );
            }}
            tableAlertOptionRender={() => {
              return false;
            }}
          />
        </Drawer>
      ) : null}
    </>
  );
};

export default Personnel;

在这里插入图片描述

相关组件地址:
ant.design-Table v4
procomponents-ProTable

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/15348.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Page管理机制

Page页分类 Buffer Pool 的底层采用链表数据结构管理Page。在InnoDB访问表记录和索引时会在Page页中缓存&#xff0c;以后使用可以减少磁盘IO操作&#xff0c;提升效率 Page根据状态可以分为三种类型&#xff1a; - free page &#xff1a; 空闲page&#xff0c;未被使用 - …

耐腐蚀高速电动针阀在半导体硅片清洗机化学药液流量控制中的应用

摘要&#xff1a;化学药液流量的精密控制是半导体湿法清洗工艺中的一项关键技术&#xff0c;流量控制要求所用调节针阀一是开度电动可调、二是具有不同的口径型号、三是高的响应速度&#xff0c;四是具有很好的耐腐蚀性&#xff0c;这些都是目前提升半导体清洗设备性能需要解决…

2023/4/25总结

刷题&#xff1a; 第一周任务 - Virtual Judge (vjudge.net) 1.这一题的思路就是先排除前面和后面相等的&#xff0c;然后找到不等的情况&#xff0c;不等情况的下标开始前后都走&#xff0c;看看是不是和b数组构成了一个升序数组即可。 #include<stdio.h> #define Ma…

【数据结构】链表详解

本片要分享的内容是链表&#xff0c;为方便阅读以下为本片目录 目录 1.顺序表的问题及思考 1.链表的遍历 2.头部插入 2.1开辟空间函数分装 3.尾部插入 纠正 4.尾部删除 5.头部删除 6.数据查找 7.任意位置插入 1.顺序表的问题及思考 上一篇中讲解了顺序表中增删查…

从源码全面解析LinkedBlockingQueue的来龙去脉

一、引言 并发编程在互联网技术使用如此广泛&#xff0c;几乎所有的后端技术面试官都要在并发编程的使用和原理方面对小伙伴们进行 360 的刁难。 二、使用 对于阻塞队列&#xff0c;想必大家应该都不陌生&#xff0c;我们这里简单的介绍一下&#xff0c;对于 Java 里面的阻塞…

Python | 基于LendingClub数据的分类预测研究Part01——问题重述+特征选择+算法对比

欢迎交流学习~~ 专栏&#xff1a; 机器学习&深度学习 本文利用Python对数据集进行数据分析&#xff0c;并用多种机器学习算法进行分类预测。 具体文章和数据集可以见我所发布的资源&#xff1a;发布的资源 Python | 基于LendingClub数据的分类预测研究Part01——问题重述特…

在.NET Core中正确使用HttpClient的方式

HttpClient 是 .NET Framework、.NET Core 或 .NET 5以上版本中的一个类&#xff0c;用于向 Web API 发送 HTTP 请求并接收响应。它提供了一些简单易用的方法&#xff0c;如 GET、POST、PUT 和 DELETE&#xff0c;可以很容易地构造和发送 HTTP 请求&#xff0c;并处理响应数据。…

【Excel统计分析插件】上海道宁为您提供统计分析、数据可视化和建模软件——Analyse-it

Analyse-it是Microsoft Excel中的 统计分析插件 它为Microsoft Excel带来了 易于使用的统计软件 Analyse-it在软件中 引入了一些新的创新统计分析 Analyse-it与 许多Excel加载项开发人员不同 使用完善的软件开发和QA实践 包括单元/集成/系统测试 敏捷开发、代码审查 …

虹科案例|虹科Micronor光纤传感器,实现核磁共振新应用!

PART 1 背景介绍 光纤传感器已成为推动MRI最新功能套件升级和新MRI设备设计背后的关键技术。将患者的某些活动与MRI成像系统同步是越来越受重视的需求。磁场强度随着每一代的发展而增大&#xff0c;因此&#xff0c;组件的电磁透明度在每一代和新应用中变得更加重要。 光学传…

《Netty》从零开始学netty源码(四十六)之PooledByteBuf

PooledByteBuf Netty中一大块内存块PoolChunk默认大小为4MB&#xff0c;为了尽可能充分利用内存会将它切成很多块PooledByteBuf&#xff0c;PooledByteBuf的类关系图如下&#xff1a; PooledUnsafeDirectByteBuf与PooledUnsafeHeapByteBuf直接暴露对象的底层地址。 PooledByt…

【英语】100个句子记完7000个托福单词

其实主要的7000词其实是在主题归纳里面&#xff0c;不过过一遍100个句子也挺好的&#xff0c;反正也不多。 文章目录 Sentence 01Sentence 02Sentence 03Sentence 04Sentence 05Sentence 06Sentence 07Sentence 08Sentence 09Sentence 10Sentence 11Sentence 12Sentence 13Sent…

数据分析中常见标准的参考文献

做数据分析过程中&#xff0c;有些分析法方法的标准随便一搜就能找到&#xff0c;不管是口口相传还是默认&#xff0c;大家都按那样的标准做了。日常分析不细究出处还可以&#xff0c;但是正式的学术论文你需要为你写下的每一句话负责&#xff0c;每一个判断标准都应该有参考文…

Docker | 解决docker 容器中csv文件乱码的情况

问题描述&#xff1a;在Ubuntu docker容器中&#xff0c;打开.csv文件时显示乱码 问题如图 错误分析&#xff1a; 用locale查看所用容器支持的字符集 从输出可以看到&#xff0c;系统使用的是POSIX字符集&#xff0c;POSIX字符集是不支持中韩文的&#xff0c;而UTF-8是支持中…

刷题4.28

1、 开闭原则软件实体&#xff08;模块&#xff0c;类&#xff0c;方法等&#xff09;应该对扩展开放&#xff0c;对修改关闭&#xff0c;即在设计一个软件系统模块&#xff08;类&#xff0c;方法&#xff09;的时候&#xff0c;应该可以在不修改原有的模块&#xff08;修改关…

vue之--使用TypeScript

搭配 TypeScript 使用 Vue​ 像 TypeScript 这样的类型系统可以在编译时通过静态分析检测出很多常见错误。这减少了生产环境中的运行时错误&#xff0c;也让我们在重构大型项目的时候更有信心。通过 IDE 中基于类型的自动补全&#xff0c;TypeScript 还改善了开发体验和效率。…

【Android Framework (八) 】- Service

文章目录 知识回顾启动第一个流程initZygote的流程system_serverServiceManagerBinderLauncher的启动AMS 前言源码分析1.startService2.bindService 拓展知识1:Service的两种启动方式对Service生命周期有什么影响&#xff1f;2:Service的启动流程3:Service的onStartCommand返回…

nginx(七十二)nginx中与cookie相关的细节探讨

背景知识铺垫 一 nginx中与cookie相关 ① Cookie请求头内容回顾 cookie的形式和属性 ② nginx获取cookie值的两种方法 1) $http_cookie -->获取Cookie请求头"所有值"2) $COOKIE_flag -->获取Cookie请求头的"某个key"[1]、脱敏场景在日志中只…

榜上有名 | 创宇盾荣登“2023 IT市场权威榜单”!

4月20日&#xff0c;已连续成功举办23届的IT市场年会在北京举行&#xff0c;作为权威咨询机构赛迪主办&#xff0c;中国IT业界延续时间最长的年度盛会之一&#xff0c;“2023 IT市场年会”隆重发布重磅权威榜单。 创宇盾作为云防护领域专业防护产品&#xff0c;在国家经济产业…

零成本教你部署一个ChatGPT网站

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

为何电商这么难做…...你是否忽略了这个问题?

物流时效是影响买家体验的重要环节&#xff0c;物流服务优劣也是买家网上购物时的重要参考依据。但电商企业对于快递公司的时效承诺、服务质量基本处于被动接受的状况&#xff0c;直到买家投诉才知道快递公司服务缺失&#xff0c;若买家不投诉也没法主动知道大量的订单是否按约…