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


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

    1. import React, { useState, useEffect, SetStateAction, Dispatch } from 'react';
    2. // 定义expandedKeys的类型
    3. type ExpandedKeysType = Set<string>;
    4. // 自定义Hook:useExpandedKeys
    5. function useExpandedKeys(initialKeys: ExpandedKeysType): [ExpandedKeysType, (key: string) => void] {
    6. const [expandedKeys, setExpandedKeys] = useState(initialKeys);
    7. // 切换某个key的展开/收起状态
    8. const toggleByKey: (key: string) => void = (key) => {
    9. setExpandedKeys((prevKeys) => {
    10. const newKeys = new Set(prevKeys);
    11. if (newKeys.has(key)) {
    12. newKeys.delete(key);
    13. } else {
    14. newKeys.add(key);
    15. }
    16. return newKeys;
    17. });
    18. };
    19. // 使用useEffect来监听expandedKeys的变化
    20. useEffect(() => {
    21. // 这里可以执行依赖于expandedKeys的操作
    22. console.log('Expanded keys have changed:', expandedKeys);
    23. // 注意:这里的代码会在每次expandedKeys变化时执行
    24. }, [expandedKeys]); // 当expandedKeys变化时,这个effect会重新运行
    25. return [expandedKeys, toggleByKey];
    26. }
    27. // 定义Item的类型
    28. type ItemType = {
    29. id: string;
    30. name: string;
    31. };
    32. // 使用自定义Hook的的组件
    33. function MyComponent() {
    34. // 使用自定义Hook,初始值为一个空的Set
    35. const [expandedKeys, toggleByKey] = useExpandedKeys(new Set<string>());
    36. // 假设有一个item列表,我们为每个item渲染一个按钮来切换其展开/收起状态
    37. const items: ItemType[] = [
    38. { id: 'item1', name: 'Item 1' },
    39. { id: 'item2', name: 'Item 2' },
    40. // ...其他items
    41. ];
    42. return (
    43. <div>
    44. {items.map((item) => (
    45. <div key={item.id}>
    46. <button onClick={() => toggleByKey(item.id)}>
    47. {expandedKeys.has(item.id) ? '收起' : '展开'}
    48. </button>
    49. {expandedKeys.has(item.id) && <div>这里是{item.name}的展开内容</div>}
    50. </div>
    51. ))}
    52. </div>
    53. );
    54. }
    55. export default MyComponent;

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

    1. import {useMap,useSet} from '@huse/collection';
    2. import constate from 'constate';
    3. import {Key,useCallback,useState} from 'react';
    4. export function useSetWithToggleAndAllChecked(){
    5. //存和当前全选状态相反的项的key
    6. // eg:已全展开时,存的是收起的项的key
    7. const [set,methods]=useSet<string>();
    8. const [allChecked,setAllChecked]=useState(false);
    9. const toggleByKey =useCallback(()=>{
    10. (key:string)=>{
    11. if(set.has(key)){
    12. methods.delete(key);
    13. }else {
    14. methods.add(key);
    15. }
    16. }
    17. },
    18. [set,methods]
    19. );
    20. const internalSetAllChecked=useCallback(()=>{
    21. (shouldAllChecked:boolean)=>{
    22. methods.clear();
    23. setAllChecked(shouldAllChecked);
    24. }
    25. },
    26. [set,methods,allChecked]
    27. );
    28. const checkIfExpandedByKey=useCallback(()=>{
    29. (key:string)=>{
    30. const has =set.has(key);
    31. if(allChecked){
    32. return !has;
    33. }else{
    34. return has;
    35. }
    36. }
    37. },
    38. [set,methods,allChecked]
    39. );
    40. return {
    41. set,
    42. methods:{toggleByKey,setAllChecked,internalSetAllChecked},
    43. isAllChecked:allChecked,
    44. checkoutExpandedByKey,
    45. }
    46. };
    47. export const [
    48. ExpandedRowProvider,
    49. useAreAllRowsExpanded,
    50. useToggleRowsExpanded,
    51. useToggleRowExpandedByKey,
    52. useCheckIfExpandedByKey,
    53. ]=constate(
    54. useSetWithToggleAndAllChecked,
    55. value=>value.isAllChecked,
    56. value=>value.methods.setAllChecked,
    57. value=>value.methods.toggleByKey,
    58. value=>value.checkIfExpandedByKey,
    59. )

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

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

    代码一下简洁了好多.

  • 相关阅读:
    Google Earth Engine-06(GEE操作方法)
    spring5:IOC操作bean管理(创建对象和set属性注入)
    thinkPHP基于php的枣院二手图书交易系统--php-计算机毕业设计
    Java并发编程的艺术笔记-Java中的线程池
    Mule的基本配置元素:Endpoint、Transformer、Filter、Flow
    OpenAPI 3.0 规范-食用指南
    Prompt Engineering优化原则 - 以Webshell代码解释为例
    【Linux】基础开发工具——yum/git/gdb
    如何对服务器进行速度的测试
    【iOS】计算器实现
  • 原文地址:https://blog.csdn.net/huihui_999/article/details/138181960