封装一个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

相关文章

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

Java使用Mail构建邮件功能的完整指南

《Java使用Mail构建邮件功能的完整指南》JavaMailAPI是一个功能强大的工具,它可以帮助开发者轻松实现邮件的发送与接收功能,本文将介绍如何使用JavaMail发送和接收邮件,希望对大家有所... 目录1、简述2、主要特点3、发送样例3.1 发送纯文本邮件3.2 发送 html 邮件3.3 发送带

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到

SpringBoot操作MaxComputer方式(保姆级教程)

《SpringBoot操作MaxComputer方式(保姆级教程)》:本文主要介绍SpringBoot操作MaxComputer方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录引言uqNqjoe一、引入依赖二、配置文件 application.properties(信息用自己

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

C#中的 Dictionary常用操作

《C#中的Dictionary常用操作》C#中的DictionaryTKey,TValue是用于存储键值对集合的泛型类,允许通过键快速检索值,并且具有唯一键、动态大小和无序集合的特性,常用操作包括添... 目录基本概念Dictionary的基本结构Dictionary的主要特性Dictionary的常用操作

C# winform操作CSV格式文件

《C#winform操作CSV格式文件》这篇文章主要为大家详细介绍了C#在winform中的表格操作CSV格式文件的相关实例,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录实例一实例效果实现代码效果展示实例二实例效果完整代码实例一实例效果当在winform界面中点击读取按钮时 将csv中

MobaXterm远程登录工具功能与应用小结

《MobaXterm远程登录工具功能与应用小结》MobaXterm是一款功能强大的远程终端软件,主要支持SSH登录,拥有多种远程协议,实现跨平台访问,它包括多会话管理、本地命令行执行、图形化界面集成和... 目录1. 远程终端软件概述1.1 远程终端软件的定义与用途1.2 远程终端软件的关键特性2. 支持的

Java中实现订单超时自动取消功能(最新推荐)

《Java中实现订单超时自动取消功能(最新推荐)》本文介绍了Java中实现订单超时自动取消功能的几种方法,包括定时任务、JDK延迟队列、Redis过期监听、Redisson分布式延迟队列、Rocket... 目录1、定时任务2、JDK延迟队列 DelayQueue(1)定义实现Delayed接口的实体类 (