项目中Ant Design Pro业务问题解决方案

ProTable实现多选+反显+筛选项多级关联选择

import {forwardRef,useImperativeHandle,useEffect,useRef,useReducer,
} from "react";
import { Drawer, Space, Button, message } from "antd";
import * as PC from "@ant-design/pro-components";
import type { FormInstance } from "antd";interface StateType {visible?: boolean; // 是否显示promotionList: any[];pageSize?: number; // 一页几条total?: number; // 总页数selectedRowKeys: any[];selectedRows: any[];oneList: any[]; //一级demo列表twoList: any[]; //二级demo列表threeList: any[]; //三级demo列表
}
interface ParamsType {pageSize?: number;current?: number;keyword?: string;pageNo?: number;
}interface PropsType {callback?: (selectedRows: any) => void; // 回调函数
}export type DemoRef = {show: (list: any[]) => void; // 显示抽屉
};const DemoDrawer = forwardRef<DemoRef, PropsType>((props, ref) => {const { callback } = props;const initState: StateType = {visible: false,pageSize: 10,total: 0,selectedRowKeys: [],selectedRows: [],oneList: [],twoList: [],threeList: [],};const [state, dispatch] = useReducer((oldState, action) => {return { ...oldState, ...action };}, initState);const formRef = useRef<FormInstance>();useImperativeHandle(ref, () => ({show: (list) => {if (list && list.length > 0) {const keys = list.map((item) => item.rowKey);dispatch({visible: true,selectedRows: list,selectedRowKeys: keys,});return;}dispatch({visible: true,});},}));// 获取列表const onQueryList = async (params: ParamsType) => {try {const res: any = await getDemoList({...params,});const total = res?.totalRow || 0;const list = res?.dataList?.map((item: any) => {return { ...item, rowKey: `${item.demoK1}-${item.demoK2}` };});dispatch({pageSize: params.pageSize,total,});return {success: true,data: list,total,...params,};} catch (err) {console.log("获取列表接口异常", err);return {};}};// 处理关闭事件const onClose = () => {dispatch(initState);};//获取一级列表const getPinLeiList = async ({id, getType }: any) => {const params: any = {};if (id&& getType) {params.id=id;}const res = await getPinLei(params);if (res) {const list = res.map((item: any) => ({label: item.name,value: item.id,}));if (!getType) {dispatch({oneList: list,});}if (getType === "getTwo") {dispatch({twoList: list,});}if (getType === "getThress") {dispatch({threeList: list,});}}};useEffect(() => {if (state?.visible) {getPinLeiList({});}}, [state?.visible]);// 处理提交事件const onSubmit = async () => {const { selectedRows } = state;if (selectedRows.length === 0) {onClose();return;}//数据校验if (selectedRows.length < 2) {message.error("至少选择2个demo");return;}if (selectedRows.length > 10) {message.error("至多选择10个demo");return;}callback?.(state.selectedRows);onClose();};const columns: PC.ProColumns<any>[] = [{dataIndex: "demoName",title: "demo名称",renderFormItem: () => {return <PC.ProFormText />;},},{dataIndex: "one",title: "一级",hideInTable: true,renderFormItem: () => {return <PC.ProFormSelect options={state?.oneList} showSearch />;},},{dataIndex: "two",title: "二级",hideInTable: true,renderFormItem: () => {return <PC.ProFormSelect options={state?.twoList} showSearch />;},},{dataIndex: "three",title: "三级",hideInTable: true,renderFormItem: () => {return <PC.ProFormSelect options={state?.threeList} showSearch />;},},];const onFieldsChange = (changedFields: any[]) => {const touched = changedFields?.[0];const field = touched?.name?.[0];if (field === "one") {if (touched.value) {//选择了一级,获取二级getPinLeiList({ id: touched.value, getType: "getTwo" });}//清空二级、三级,同时清空form值dispatch({twoList: [],threeList: [],});formRef.current?.setFieldsValue({two: undefined,three: undefined,});}if (field === "two") {if (touched.value) {//选择了二级,获取三级getPinLeiList({id: touched.value,getType: "getThress",});}//情况三级,同时清空form值dispatch({threeList: [],});formRef.current?.setFieldsValue({three: undefined,});}};return (<DrawerdestroyOnClosetitle={"添加demo"}placement="right"width="80%"closablemaskClosable={false}onClose={onClose}open={state?.visible}footer={<Space><Button onClick={onClose}>取消</Button><Buttontype="primary"onClick={onSubmit}disabled={state.selectedRows.length < 1}>确认</Button></Space>}><PC.ProTablerowKey="rowKey"options={false}columns={columns}pagination={{pageSizeOptions: ["10", "20", "50"],pageSize: state.pageSize,total: state.total,showSizeChanger: true,}}search={{defaultCollapsed: false,span: 8,}}form={{ onFieldsChange }}formRef={formRef}rowSelection={{preserveSelectedRowKeys: true,type: "checkbox",selectedRowKeys: state.selectedRowKeys,onChange: (selectedRowKeys, selectedRows) => {//反显问题const rowsList = selectedRows?.map((item, index) => {if (item) {return item;} else {const rowKey = selectedRowKeys[index];const row = state.selectedRows.filter((i: any) => i.rowKey === rowKey)[0];return row;}});dispatch({ selectedRowKeys, selectedRows: rowsList });},getCheckboxProps: (record: any) => ({disabled: record.type === "demo",}),}}request={(params: ParamsType) => {const newParams = {currentPage: params.current,pageSize: params.pageSize,...params,};delete newParams.current;return onQueryList(newParams);}}/></Drawer>);
});export default DemoDrawer;

反显时候onChange: (selectedRowKeys, selectedRows)中selectedRows可能会有undefined,需要把对应数据还原回去。

form={{ onFieldsChange }}实现级联选择。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP项目添加分布式锁,这里是ThinkPHP8框架实现分布式锁

背景&#xff1a;公司旧项目&#xff0c;最初访问量不多&#xff0c;单机部署的。后来&#xff0c;访问量上来了&#xff0c;有阵子很卡&#xff0c;公司决定横向扩展&#xff0c;后端代码部署了三台服务器。部署调整后&#xff0c;有用户反馈&#xff0c;一个订单支付了三次。…

网络原理--http

目录 一、 DNS&#xff08;应用层协议&#xff09; 1、域名概念 2、维护ip地址和域名之间的映射&#xff08;域名解析系统&#xff09; 3、DNS系统&#xff08;服务器&#xff09; 4、如何解决DNS服务器高并发问题 二、HTTP&#xff08;应用层协议&#xff09; 1、htt…

win10安装ssh服务

前置条件&#xff1a; 远程虚拟机&#xff0c;防火墙关闭&#xff0c;本地主机与虚拟机互相可以ping通 虚拟机是win10专业版本 操作步骤&#xff1a; 1、搜索框搜索“Windows PowerShell”并以管理员身份运行 2、输入如下代码&#xff0c;检查本地是否有ssh服务&#xff0c…

【Docker】网络模式➕自定义网络

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 一.Docker网络模式的介绍 二. 网桥模…

Linux内核架构和工作原理详解(二)

Linux内核体系结构简析简析 图1 Linux系统层次结构 最上面是用户&#xff08;或应用程序&#xff09;空间。这是用户应用程序执行的地方。用户空间之下是内核空间&#xff0c;Linux 内核正是位于这里。GNU C Library &#xff08;glibc&#xff09;也在这里。它提供了连接内核…

【JVM】类的生命周期

目录 类的生命周期 加载阶段 连接阶段 初始化阶段 类的使用阶段 类的加载阶段 类的生命周期 加载阶段 在加载阶段&#xff0c;类加载器首先会通过一个类的全限定名来获取定义此类的二进制字节流。这个步骤主要是将整个Class 文件解析成二进制流。 &#xff08;全限定名是…

海外代理IP怎么用?常见使用问题及解决方案

海外代理IP是指提供全球范围内的代理服务器&#xff0c;代理服务器充当IP与目标网站之间的中介&#xff0c;可以起到安全匿名、提高网速、突破网络壁垒的作用。在使用代理IP的过程中&#xff0c;用户可能会遇到各种挑战&#xff0c;如连接问题、速度慢等。理解这些问题的原因并…

HCIP第一次练习 -- RIP复习实验

要求&#xff1a; 需求:R1-R2-R3-R4-R5运行RIPV2 R6-R7运行RIPV1 1.使用合理地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回172.16.1.1/24172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条自数量,增加路由传递安全性 5.R5创建一个环回模拟运营商,不…

申泰勇教练的独家人物化身系列即将登陆 The Sandbox

申泰勇&#xff08;Shin Tae-yong&#xff09;教练是足球界的传奇人物&#xff0c;他来到 The Sandbox&#xff0c;推出了自己的专属人物化身系列。作为前 K 联赛中场球员和印尼队取得历史性成就的幕后教练&#xff0c;他的传奇经历现在已经影响到了虚拟世界。 向过去、现在和未…

基于ArcGIS的晕线制作

在借助ArcGIS进行制图时&#xff0c;我们有时需要为矢量边界添加晕线&#xff0c;今天就来探索一下基于ArcGIS的晕线制作操作。 软件版本&#xff1a;ArcMap10.4.1 方法一&#xff1a;制作多环缓冲区 工具路径&#xff1a;Analysis Tools-Proximity-Mutiple Ring Buffer 思…

前后端跨域问题

告别烦恼&#xff0c;彻底解决跨域问题的终极指南-chrome的安全进阶之路_chrom 强制跨域-CSDN博客

在linux安装LAStools

LAStools下载&#xff1a; https://github.com/LAStools/LAStools/releases 编译安装&#xff1a; # 设置安装路径 cmake -DCMAKE_INSTALL_PREFIX/home/vis/work/SourceCode/LAStools-2.0.2/build cmake . cmake --build . make install编译后的库&#xff1a;

【昕宝爸爸小模块】深入浅出之JDK21 中的虚拟线程到底是怎么回事(二)

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

node版本过高与node-sass不兼容问题

第一步&#xff1a;安装yarn 安装cnpm 第二步&#xff1a;yarn install 这一步可能会出现node版本过高报错 yarn config set ignore-engines true 执行 自动补充兼容命令 然后重新yarn install 出现报错&#xff1a; 第三步&#xff1a;使用cnpm 单独安装 cnpm install node-…

Acrel-1000安科瑞变电站综合自动化系统选型与应用

摘 要&#xff1a;变电站综合自动化系统是将变电站内的二次设备经过功能的组合和优化设计&#xff0c;利用先进的计算机技术、通信技术、信号处理技术&#xff0c;实现对全变电站的主要设备和输、配电线路的自动监视、测量、控制、保护、并与上级调度通信的综合性自动化功能。为…

【Docker】网络配置的三种方式

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Docker实战》。&#x1f3af;&#x1f3af; &…

【C++】- 类和对象(运算符重载!!const!!详解!!)

类和对象③ 介绍运算符重载赋值运算符重载运算符重载const 在学习C语言时&#xff0c;我们首先接触的就是变量&#xff0c;再深入学习&#xff0c;我们可以利用运算符对变量进行操作&#xff0c;当我们使用C编写程序时&#xff0c;经常会遇到一些需要对特殊的例如自定义数据类型…

WEB 3D技术 three.js 3D贺卡(2) 加入天空与水面效果

上文 WEB 3D技术 three.js 3D贺卡(1) 搭建基本项目环境 我们简单搭了一个贺卡雏形 然后 我们要引入一个hdr的一个天空的效果 所以 我们需要在代码中导入 RGBELoader //导入 RGBELoader hdr工具 import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader"…

文件加密怎么设置?文件工具哪个好用?

在使用电脑时&#xff0c;我们可以通过加密来保护电脑中的重要文件&#xff0c;那么&#xff0c;文件加密要怎么设置呢&#xff1f;下面我们就来了解一下。 文件夹加密超级大师 作为“加密大师”&#xff0c;文件夹加密超级大师支持文件加密功能&#xff0c;并提供了金钻加密和…