封装一个antd的Table操作项中的一个展开与收起通用功能

2024-04-26 23:52

本文主要是介绍封装一个antd的Table操作项中的一个展开与收起通用功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一种方法,不使用任何插件和库 

import React, { useState, useEffect, SetStateAction, Dispatch } from 'react';  // 定义expandedKeys的类型  
type ExpandedKeysType = Set<string>;  // 自定义Hook:useExpandedKeys  
function useExpandedKeys(initialKeys: ExpandedKeysType): [ExpandedKeysType, (key: string) => void] {  const [expandedKeys, setExpandedKeys] = useState(initialKeys);  // 切换某个key的展开/收起状态  const toggleByKey: (key: string) => void = (key) => {  setExpandedKeys((prevKeys) => {  const newKeys = new Set(prevKeys);  if (newKeys.has(key)) {  newKeys.delete(key);  } else {  newKeys.add(key);  }  return newKeys;  });  };  // 使用useEffect来监听expandedKeys的变化  useEffect(() => {  // 这里可以执行依赖于expandedKeys的操作  console.log('Expanded keys have changed:', expandedKeys);  // 注意:这里的代码会在每次expandedKeys变化时执行  }, [expandedKeys]); // 当expandedKeys变化时,这个effect会重新运行  return [expandedKeys, toggleByKey];  
}  // 定义Item的类型  
type ItemType = {  id: string;  name: string;  
};  // 使用自定义Hook的的组件  
function MyComponent() {  // 使用自定义Hook,初始值为一个空的Set  const [expandedKeys, toggleByKey] = useExpandedKeys(new Set<string>());  // 假设有一个item列表,我们为每个item渲染一个按钮来切换其展开/收起状态  const items: ItemType[] = [  { id: 'item1', name: 'Item 1' },  { id: 'item2', name: 'Item 2' },  // ...其他items  ];  return (  <div>  {items.map((item) => (  <div key={item.id}>  <button onClick={() => toggleByKey(item.id)}>  {expandedKeys.has(item.id) ? '收起' : '展开'}  </button>  {expandedKeys.has(item.id) && <div>这里是{item.name}的展开内容</div>}  </div>  ))}  </div>  );  
}  export default MyComponent;

第二种方法,和第一种大同小异,只不过写法高级一些,并使用了额外的库和插件

import {useMap,useSet} from '@huse/collection';
import constate from 'constate';
import {Key,useCallback,useState} from 'react';export function useSetWithToggleAndAllChecked(){//存和当前全选状态相反的项的key// eg:已全展开时,存的是收起的项的keyconst [set,methods]=useSet<string>();const [allChecked,setAllChecked]=useState(false);const toggleByKey =useCallback(()=>{(key:string)=>{if(set.has(key)){methods.delete(key);}else {methods.add(key);}}},[set,methods]);const internalSetAllChecked=useCallback(()=>{(shouldAllChecked:boolean)=>{methods.clear();setAllChecked(shouldAllChecked);}},[set,methods,allChecked]);const checkIfExpandedByKey=useCallback(()=>{(key:string)=>{const has =set.has(key);if(allChecked){return !has;}else{return has;}}},[set,methods,allChecked]);return {set,methods:{toggleByKey,setAllChecked,internalSetAllChecked},isAllChecked:allChecked,checkoutExpandedByKey,}
};export const [ExpandedRowProvider,useAreAllRowsExpanded,useToggleRowsExpanded,useToggleRowExpandedByKey,useCheckIfExpandedByKey,
]=constate(useSetWithToggleAndAllChecked,value=>value.isAllChecked,value=>value.methods.setAllChecked,value=>value.methods.toggleByKey,value=>value.checkIfExpandedByKey,
)

 ExpandedRowProvider相当于提供一个conText上下文

//使用时,顶层组件
<ExpandedRowProvider>
</ExpandedRowProvider>
//这个key就是后端返回的Table列表数据的每一项key值,或者是id
const isExpanded = useCheckIfExpandedByKey()(key)
const toggleByKey = useToggleRowExpandedByKey();<a onClick={()=>toggleByKey(key)}>{isExpanded?'收起':'展开'}</a>

代码一下简洁了好多.

这篇关于封装一个antd的Table操作项中的一个展开与收起通用功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/939007

相关文章

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

在C#中分离饼图的某个区域的操作指南

《在C#中分离饼图的某个区域的操作指南》在处理Excel饼图时,我们可能需要将饼图的各个部分分离出来,以使它们更加醒目,Spire.XLS提供了Series.DataFormat.Percent属性,... 目录引言如何设置饼图各分片之间分离宽度的代码示例:从整个饼图中分离单个分片的代码示例:引言在处理

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

SpringBoot整合Apache Spark实现一个简单的数据分析功能

《SpringBoot整合ApacheSpark实现一个简单的数据分析功能》ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务... 目录第一步、添加android依赖第二步、编写配置类第三步、编写控制类启动项目并测试总结ApacheS