项目中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,一经查实,立即删除!

相关文章

Berstagram ——模拟

Polycarp最近注册了一个新的社交网络Berstagram。他立即在那里发表了 n 篇帖子。他给所有帖子分配了从 1 到 n 的数字&#xff0c;并逐一发布。所以&#xff0c;就在发布Polycarp的新闻推送后&#xff0c;包含了从 1 到 n 的帖子——最高的帖子编号为 1&#xff0c;下一个帖子编…

Snakemake:初探

我已经安装了mamba&#xff08;没有的话可以这样试试&#xff09; curl -L https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh -o Mambaforge-Linux-x86_64.sh bash Mambaforge-Linux-x86_64.sh 安装snakemake Setup - Snakem…

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

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

【Java高级应用:深入探索Java编程的强大功能,JVM 类加载机制, JVM 内存模型,垃圾回收机制,JVM 字节码执行,异常处理机制】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

网络原理--http

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

开源云真机平台-Sonic平台-python自定义脚本-config.json方式实现全局配置参数的读写操作

【主要功能】 config.json方式实现全局配置参数的读写操作 使用python实现以下功能&#xff1a; 1、使用将接口获取的变量值&#xff0c;写入到当前目录下的config文件中&#xff0c;如delayTime10&#xff1b; 2、读取当前目录下的config文件中&#xff0c;特定变量的值&…

修改默认负载均衡策略(Ribbon)

修改方式 配置类配置文件 配置类 增加配置类&#xff1a;配置类必须拥有 Configuration 且不能在 ComponentScan 包下 package com.learning.springcloud.config; import com.alibaba.cloud.nacos.ribbon.NacosRule; import com.netflix.loadbalancer.IRule; import org.sp…

vue3深入组件:组件事件

触发与监听事件 在组件的模板表达式中&#xff0c;可以直接使用 $emit 方法触发自定义事件&#xff1a; <button click"$emit(someEvent)">click me</button>父组件可以通过 v-on (缩写为 ) 来监听事件&#xff1a; <MyComponent some-event"…

fs 模块

1. fs写文件 1.1 普通写入 const fs require(fs) // 异步写入 fs.writeFile(./hello.txt,刚刚我错过的大雨,err>{console.log(err); }) // 同步写入 fs.writeFileSync(./text.txt,hello boy!)1.2 文件的追加写入 const fs require(fs) fs.appendFile(./text.txt,\r\r\r…

【华为OD机试真题2023CD卷 JAVAJS】高效货运

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 高效货运 知识点递归循环 时间限制:1s 空间限制:32MB 限定语言:不限 题目描述: 1.老李是货运公司承运人,老李的货车额定载货重量为wt 2.现有两种货物,货物A单件重量为wa,单件运费利润为pa,货物B单件重量为wb,单…

0115qt聊天室客户端+数据库

#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase>//数据库管理类 #include <QSqlQuery>//执行sql语句类 #include <QSqlRecord>//数据库记录类 #include <QSqlError>//数据库错误类 #include <QMessageBox>/…

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;也在这里。它提供了连接内核…

【react】记录一次react组件props依赖异步数据(setFieldsValue)后传递form给子组件,再逐层传递给孙子组件引起的未渲染异常

背景 react祖父组件设置异步数据&#xff08;setFieldsValue&#xff09;后传递form给子组件&#xff0c;再逐层传递给孙子组件引起的未渲染异常&#xff0c;孙子组件如果不设置useEffect和useState去监听value的值进行重渲染&#xff0c;会出现获取得到value最新值&#xff0…

【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;他的传奇经历现在已经影响到了虚拟世界。 向过去、现在和未…