当前位置: 首页 > news >正文

react+antd封装表格组件2.0

react+antd封装表格组件2.0

  • 1.0版本 仅仅封装组件,不涉及方法
    • 需要掌握知识点
      • useImperativeHandle
  • 组件代码
  • 引用

1.0版本 仅仅封装组件,不涉及方法

1.0 仅封装组件
此方法把所用方法集体封装,以后就可以无脑开发拉!

  • 只需传入路径,组件列表请求、增删改后更新属性均在组件内发生
  • 当前页不是第一页且删除后无数据,则自动跳转到上一页
  • 查询时防止多次点击,点击一次后加遮罩,数据返回后放开
  • 已有查询条件时,再次分页带上查询条件

需要掌握知识点

useImperativeHandle

一个用于暴露自定义ref属性和自定义方法的钩子函数。可以使得父组件可以通过ref访问子组件中定义的方法和属性,从而实现对子组件的精细控制

!!使用useImperativeHandle时必须与forwardRef搭配使用,否则会报错

  • 具体使用步骤如下
//在子组件中定义需要暴露给父组件的方法和属性,并将这些方法和属性放在一个对象中
import { useImperativeHandle, forwardRef } from 'react';const Child = forwardRef((props, ref) => {const [count, setCount] = useState(0);const increment = () => {setCount(count + 1);};// 定义需要暴露给父组件的方法和属性useImperativeHandle(ref, () => ({increment,count,}));return <div>{count}</div>;
});
//在父组件中使用子组件,并给子组件传递一个ref属性,
import { useRef } from 'react';
import Child from './Child';const Parent = () => {// 创建一个refconst childRef = useRef();// 在父组件中通过ref访问子组件的方法和属性const handleClick = () => {childRef.current.increment();};return (<div><button onClick={handleClick}>Click me</button><Child ref={childRef} /></div>);
};
//父组件中的handleClick方法通过childRef.current访问了Child组件中的increment方法和count属性。

组件代码

import { Table, Pagination, Button, Dropdown, Checkbox, message } from 'antd';
import { useDispatch } from 'umi';
import { useState, useEffect, forwardRef, useImperativeHandle } from 'react';
import { PicRightOutlined } from '@ant-design/icons';import './index.less';const TableComponent = forwardRef((props, ref) => {const dispatch = useDispatch();const [open, setOpen] = useState(false); //动态控制列的下拉显隐const [items, setItems] = useState([]); //当前的下拉选择状态const [loading, setLoading] = useState(true); //当前的加载状态const [dataSource, setDataSource] = useState([]); //列表数据const [total, setTotal] = useState(0); //分页总数const [size, setSize] = useState(10); //分页页数const [current, setCurrent] = useState(1); //分页当前页// 抛出获取列表方法useImperativeHandle(ref, () => ({getList,}));// 表格列表const [columns, setColumns] = useState(props.columns.map((item) => {return {...item,align: 'center',ellipsis: {showTitle: false,},};}),);//控制列的初始值const [starCol, setStarCol] = useState(props.columns.map((item) => {return {...item,check: true,align: 'center',ellipsis: {showTitle: false,},};}),);useEffect(() => {changItem(starCol);}, [props]);useEffect(() => {if (props.columns || props.columns.length > 0) {setColumns(props.columns.map((item) => {return {...item,align: 'center',ellipsis: {showTitle: false,},};}),);setStarCol(props.columns.map((item) => {return {...item,check: true,align: 'center',ellipsis: {showTitle: false,},};}),);}}, [props.columns]);useEffect(() => {// 初始请求列表if (props.url) {getList();}}, [props.url]);useEffect(() => {// 新增编辑后列表刷新if (props.list) {const list = props.list?.map((item, index) => {return {index: serialNumber(current, size, index + 1),...item,};});setDataSource(list);}}, [props.list]);useEffect(() => {if (props.search) {dispatch({type: 'utils/searchLoadingEvent',payload: true,});// 搜索请求列表getList(1, size, props.search, true);}}, [props.search]); //监听列表传入查询条件const getList = (pageCurrent, pageSize, values, isClickSearch) => {if (!isClickSearch) {// 获取列表时 没点击查询按钮 加载列表setLoading(true);}const payload = {current: pageCurrent || current,size: pageSize || size,...values,};dispatch({type: props.url,payload: payload,callback: (res) => {if (res) {setTotal(res.total);setSize(res.size);setCurrent(res.current);const list = res.data?.map((item, index) => {return {index: serialNumber(res.current, res.size, index + 1),...item,};});setDataSource(list);setLoading(false);props.listPaginationChange(payload); //更新接口条件// 处理列表最后一条数据删除时请求上一页数据if (res.data?.length == 0 && res.total > 0) {getList(res.current - 1, res.size, props.search);}//点击查询按钮 获取到数据后 关闭局部加载if (isClickSearch) {dispatch({type: 'utils/searchLoadingEvent',payload: false,});}}},});};// 分页查询列表const paginationChange = (pageCurrent, pageSize) => {getList(pageCurrent, pageSize, props.search || null);};//这个方法可加可不加,是因为前端需要展示序号,而后端不返回,所以就自己计算啦!const serialNumber = (pageIndex, pageSize, index) => {return (pageIndex - 1) * pageSize + index;};// 控制显示列的操作const onClick = ({ key }) => {if (key == 'all') {const newDrop = starCol;newDrop.map((o, index) => {o.check = true;});changItem(starCol);setColumns(props.columns.map((item) => {return {...item,check: true,align: 'center',ellipsis: {showTitle: false,},};}),);} else {const newDrop = starCol;newDrop.map((o, index) => {if (index == key) {o.check = !o.check;}});let newColumns = newDrop.filter((o) => o.check);if (newColumns.length == 0) {message.warning('请至少选择一列');} else {setStarCol(newDrop);changItem(newDrop);setColumns(newColumns); //列状态}}};// 列的选中状态改变const changItem = (data) => {let opitems = data.map((item, index) => {return {key: index,label: <Checkbox checked={item.check}>{item.title}</Checkbox>,};});opitems.unshift({key: 'all',label: <Button>{'全选列'}</Button>,},{type: 'divider',},);setItems(opitems); //当前的下拉状态};return (<div className="table">{!props?.selectIf && (<Dropdownmenu={{items,onClick,}}overlayClassName="drop"trigger={['click']}onOpenChange={() => setOpen(!open)}open={open}arrowplacement="bottomRight"><a onClick={(e) => e.preventDefault()}><Button icon={<PicRightOutlined />} title="显示/隐藏列"></Button></a></Dropdown>)}<Tableborderedcolumns={columns}rowSelection={props?.rowSelection}// dataSource={isShow ? dataSource : null}dataSource={dataSource}rowKey={(item) => item.id || item.categoryId || item.modelId}pagination={false}className="insiadeTable"scroll={{y: 450,...props?.scroll,}}onRow={props?.onRow}rowClassName={props?.rowClassName}summary={props?.summary}loading={loading}/><div className="pagination"><PaginationshowQuickJumperdefaultCurrent={current}total={total}showTotal={(total) => `${total}`}size={size}current={current}onChange={paginationChange}pageSizeOptions={[10, 50, 100, 500]}/></div></div>);
});export default TableComponent;

引用

···const [search, setSearch] = useState(null); //搜索条件const tableComponentRef = useRef(null);const list = useSelector((state) =>state.roleManagement.roleManagementList);const [search, setSearch] = useState(null);const [listChange, setListChange] = useState(list);const [listPaginationChange, setListPaginationChange] = useState(null);
···useEffect(() => {if (list) {setListChange(list); //组件内数据响应后此处更新}}, [list]);
···const onFinish = (values) => {setSearch(values); //点击搜索后设置值};···<Form onFinish={onFinish} form={form} requiredMark={'Hidden'}><Row gutter={16}><Col span={6}><Form.Itemname="keyword"label="关键字"><Input allowClear /></Form.Item></Col><Col span={4}><Space><Buttontype="primary"icon={<SearchOutlined />}htmlType="submit">搜索</Button><Buttonicon={<SyncOutlined />}onClick={() => {form.resetFields();}}>重置</Button></Space></Col></Row></Form><TableComponentref={tableComponentRef} //组件实例url="roleManagement/getRoleManagementList"search={search} //搜索条件list={listChange} //数据源listPaginationChange={(e) => {//{current:1,size:10,..查询条件} 格式setListPaginationChange(e);}}className="list"columns={columns} //列scroll={{x: 1600,}}/>
  • 新增修改组件
      <EditfillingForm={fillingForm}open={isModalOpen}setIsModalOpen={setIsModalOpen}//修改新增组件只需传入listPaginationChange,便可保留分页及查询条件listPaginationChange={listPaginationChange}/>//修改新增后调用即可 const getRoleList = () => {dispatch({type: 'roleManagement/getRoleManagementList',payload: props.listPaginationChange,};

相关文章:

react+antd封装表格组件2.0

reactantd封装表格组件2.0 1.0版本 仅仅封装组件&#xff0c;不涉及方法需要掌握知识点useImperativeHandle 组件代码引用 1.0版本 仅仅封装组件&#xff0c;不涉及方法 1.0 仅封装组件 此方法把所用方法集体封装&#xff0c;以后就可以无脑开发拉&#xff01; 只需传入路径&…...

互联网Java工程师面试题·Java 并发编程篇·第八弹

目录 33、Java 死锁以及如何避免&#xff1f; 34、死锁的原因 35、怎么唤醒一个阻塞的线程 36、不可变对象对多线程有什么帮助 37、什么是多线程的上下文切换 38、如果你提交任务时&#xff0c;线程池队列已满&#xff0c;这时会发生什么这里区分一下&#xff1a; 39、J…...

21面向对象描述器

目录 1、什么是描述器&#xff1f; 1、原始的代码可以理解成为这样&#xff1a; 2、增加解释器可以改成如下&#xff0c;解释器就是集增删改查为一体的一个小的property 有一点需要注意的地方是&#xff1a;property里面内置的参数不是get_age()就是不用调用。 3、装饰器可…...

高校教务系统登录页面JS分析——皖西学院

高校教务系统密码加密逻辑及JS逆向 本文将介绍皖西学院教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密…...

单片机综合小项目

一、单片机做项目常识 1.行业常识 2.方案选型 3.此项目定位和思路 二、单片机的小项目介绍 1.项目名称&#xff1a;基于51单片机的温度报警器 &#xff08;1&#xff09;主控&#xff1a;stc51&#xff1b; &#xff08;2&#xff09;编程语言&#xff1a;C语言 &#xff08;…...

docker下的onlyoffice安装(for seafile)

docker镜像拉取 # 拉取 onlyoffice 镜像docker pull onlyoffice/documentserver 创建所需目录 # 创建几个目录 用于 onlyoffice 的数据卷cd /opt# 建议与 seafile 容器都放在 /opt 目录方便管理mkdir seafile-onlyofficecd seafile-onlyofficemkdir logmkdir datamkdir libmkd…...

1 两数之和

解题思路&#xff1a; \qquad 对每个数nums[i]&#xff0c;仅需在数组中搜索target-nums[i]是否存在。 优化思路&#xff1a; \qquad 首先能想到&#xff0c;利用哈希表O(1)查询target-nums[i]。 \qquad 建立map<int, vector<int>>的表能够处理重复元素&#x…...

NewStarCTF2023week2-Unserialize?

代码审计&#xff1a; 定义了一个eval类&#xff0c;该类下有一个私有变量cmd和公有成员函数destruct()&#xff0c;该函数在对象的所有引用都被删除或类被销毁时会自动调用&#xff1b; 调用该函数则会执行一个正则表达式进行正则匹配&#xff0c;过滤掉了一些常用命令和bas…...

OpenMesh 最优选点策略

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 继续沿着之前的思路:OpenMesh 网格顶点Quadric误差计算,有时候,无论是网格简化或是网格平滑,总会涉及到添加一个新的顶点的问题,那么新顶点应该怎么生成呢?以网格的简化操作为例,假设我们要合并两个顶点,也…...

服务器内存总量和内存条有差异是什么问题 103.239.244.X

服务器内存总量和内存条上标注的容量可能会存在一些差异&#xff0c;这是由于以下几个原因&#xff1a; 部分内存被保留给系统和其他硬件设备&#xff1a;在服务器中&#xff0c;一部分内存可能被保留给系统和其他硬件设备&#xff0c;比如显卡、网卡、RAID卡等。这些设备需要一…...

WPF DataGrid详细列表手动显示与隐藏

设置显示序号与折叠显示样式 <DataTemplate x:Key"dtNum"><Button BorderBrush"Transparent" Style"{x:Null}" Click"BtnRowDetail_ShowHideClick" FontSize"16" Background"Transparent"><Stack…...

Compose 组件 - 分页器 HorizontalPager、VerticalPager

一、概念 类似于 ViewPager&#xff0c;1.4 版本之前需要借助 accompanis 库&#xff0c;底层基于 LazyColumn、LazyRow 实现&#xff0c;在使用上也基本相同。默认情况下 HorizontalPager 占据屏幕的整个宽度&#xff0c;VerticalPager 会占据整个高度。 fun HorizontalPager(…...

Web3 招聘 | Bitget、MyShell、imToken、Arweave 多项目招聘中

「Web3 招聘」是 TinTinLand 为 Web3 项目和求职者创建的一个招聘信息汇集专栏。本栏目将持续更新区块链行业招聘信息&#xff0c;满足不同求职者与项目方的多样需求。欢迎各项目方联系 TinTinLand 发布职位需求&#xff0c;欢迎求职者关注 TinTinLand 获取最新招聘信息。 此外…...

通过HTTP发送大量数据的三种方法

在网络的早期时期&#xff0c;人们发送的文件大小仅为几KB。到了2023年&#xff0c;我们享受着高分辨率的MB级别图像&#xff0c;并在几GB的4K&#xff08;即将是8K&#xff09;视频中观看。 即使有良好的互联网连接&#xff0c;下载一个5GB的文件仍然需要一些时间。如果你拥有…...

【MySQL】索引和事物

目录 ♫索引 ♪什么是索引 ♪索引的数据结构 ♪索引的使用 ♫事务 ♪什么是事务 ♪事务的特性 ♪事务的使用 ♫索引 ♪什么是索引 索引是存储在磁盘上的一个数据结构&#xff0c;通过索引可以快速地定位到存储在磁盘上的数据。 索引在提高查询速度的同时&#xff0c;还提…...

win11下的VS2022+QT6+VTK9.2+PCL1.13.1联合开发环境配置及踩坑记录

准备工作&#xff1a; 安装VS2022&#xff1a;这个比较简单&#xff0c;网上随便找个教程就行 安装QT并为VS2022添加QT Creater插件&#xff1a;VS2022配置Qt6_vs2022 qt6-CSDN博客 安装PCL&#xff1a;vs2022配置pcl1.13.1_pcl配置-CSDN博客 安装PCL过程中本身也会安装VTK&…...

CEdit

1、https://www.cnblogs.com/milanleon/p/5626174.html 2、CEdit控件提供访问函数主要有&#xff1a; int GetWindowText(LPCTSTR lpszStringBuf,intnMaxCount) 获取控件文本&#xff0c;与ReadText()功能相同 void SetWindowText(LPCTSTR lpszString) 设置控件文本 void …...

vue3 自定义指令

Vue 除了内置的一系列指令 (比如 v-model 或 v-show) 之外&#xff0c;Vue 还允许你注册自定义的指令。 一个自定义指令由一个包含类似组件生命周期钩子的对象来定义。钩子函数会接收到指令所绑定元素作为其参数。 在setup语法糖中&#xff0c;任何以 v 开头的驼峰式命名的变量…...

用PolarDB|PostgreSQL提升通用ai机器人在专业领域的精准度

目录 背景 基本步骤讲解 Demo 演示 思考 如果不是用openai? 开源社区能干点啥? ai应用 收录专栏&#xff1a;PolarDB for PostgreSQL&#xff0c;后续将会发布PolarDB for PostgreSQL教程&#xff0c;大家感兴趣的话可以点个订阅呀&#xff01; 简介&#xff1a; chat…...

idea中maven plugin提示not found

在终端中输入&#xff1a; mvn dependency:resolve 然后 解决了部分问题 Plugin org.apache.maven.plugins:maven-jar-plugin:3.1.0 not found 改为3.3.0了 Plugin maven-source-plugin:3.3.0 not found 改为 2.4 了 版本下降了 感觉后继有坑 待观察...

Hadoop3教程(七):MapReduce概述

文章目录 &#xff08;68&#xff09; MR的概述&优缺点&#xff08;69&#xff09;MR的核心思想MapReduce进程 &#xff08;70&#xff09;官方WC源码&序列化类型&#xff08;71&#xff09;MR的编程规范MapperReducerDriver &#xff08;72&#xff09;WordCount案例需…...

【Doris实战】Apache-doris-2.0.2部署帮助手册

Apache-doris-2.0.2部署帮助手册 校验时间&#xff1a;2023年10月11日 文章目录 Apache-doris-2.0.2部署帮助手册安装前准备安装包安装要求Linux 操作系统版本需求软件需求句柄需求关闭 Swap网络需求 部署规划用户规划目录规划免密需求 安装步骤配置JDK配置Doris文件 启动与停止…...

如何处理接口调用的频率限制

背景 接口提供方有调用频率限制的场景下&#xff0c;如何合理设计接口请求? 方案 采用Redis队列&#xff0c;利用 lpush 和 rpop 命令来实现 首先&#xff0c;将订单依次lpush写入Redis队列。定时任务通过 rpop 获取队列订单进行接口调用。 额外说明&#xff1a; 若想查看…...

Ubuntu 22.04上安装Anaconda,及 conda 的基础使用

1. 安装软件依赖包&#xff1a; apt install libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6 2. 下载Anaconda安装包 使用 wget下载您从Anaconda网站复制的链接。您将把它输出到一个名为anaconda.sh的文…...

算法练习13——跳跃游戏II

LeetCode 45 跳跃游戏 II 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回…...

算法|每日一题|只出现一次的数字|位运算

136.只出现一次的数字 力扣每日一题&#xff1a;136.只出现一次的数字 之前整理过本题及其扩展&#xff0c;详细说明了思路和做法&#xff0c;链接如下&#xff1a; 只出现一次的数字I&#xff0c;II&#xff0c;III 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出…...

Smartforms 打印出现的问题

上半年ECC做了升级 程序代码从ECC迁移到S4 有用户反馈 打印不能用了 经过调试发现在打印程序中 竟然返回2&#xff0c;但是 smartforms ZRPT_CO_YFLL_DY又是存在的 。 然后去激活 并与 ECC对比发现问题 S4的页大小竟然这么小 找到对应的页格式 对比ECC和S4 果然是这个…...

【考研408真题】2022年408数据结构41题---判断当前顺序存储结构树是否是二叉搜索树

文章目录 思路408考研各数据结构C/C代码&#xff08;Continually updating&#xff09; 思路 很明显&#xff0c;这是一个顺序存储结构的树的构成方法。其中树的根节点位置从索引0开始&#xff0c;对于该结构&#xff0c;存在有&#xff1a;如果当前根节点的下标为n&#xff0c…...

深度学习DAY3:激活函数

激活函数映射——引入非线性性质 h &#xff08;Σ(W * X)b&#xff09; yσ&#xff08;h&#xff09; 将h的值通过激活函数σ映射到一个特定的输出范围内的一个值&#xff0c;通常是[0, 1]或[-1, 1] 1 Sigmoid激活函数 逻辑回归LR模型的激活函数 Sigmoid函数&#xff0…...

puppeteer

目录 介绍启动方法功能一、爬虫优势如何实现爬虫小demo 功能二、执行脚本百度搜索脚本demo 功能三、获取cookie&#xff08;这个只能是模拟浏览器当前进入网页的cookie不是平时用的下载的的浏览器的cookie&#xff09;功能四、监控网页&#xff0c;进行性能分析 介绍 puppetee…...