用表头设置控制表格内列的排序和显示隐藏

项目背景 : react + ant

需求 :  点击表头设置弹窗 , 拖拽可控制外部表格列的排序 , 开关可控制外部表格列的显示和隐藏

实现效果如下 :


注意 :  1. 拖拽效果参考了ant-table中的拖拽效果(这块代码放最后)  
            2. 后台反了json格式(用is_show控制显示和隐藏 , 我给他传递sort值来控制排序 , 后台返回格式如下~)
            3. 将拖拽和显示隐藏后的内容存到了localStorage

实现 : 
 

  const [biaotouData, setBiaotouData] = useState([
    {
      key: 'orderNumber',
      orderNumber: '工单编号'
    },
    {
      key: 'placeName',
      orderNumber: '地点'
    },
.....
 ])

  const biaotouColumns = [
    {
      render: () => <DragHandle />            // 让拖拽图标在第一列
    }, 
     {
      title: (
        <span style={{ color: dropdownOpen1 ? ' var(--main-bg)' : '#333' }}>
          {t('HeaderColumn')}
        </span>
      ),
      dataIndex: 'orderNumber',
      align: 'center',
      key: 'orderNumber'
    },

    {
      title: (
        <span style={{ color: dropdownOpen2 ? ' var(--main-bg)' : '#333' }}>
          {t('WhetherDisplayed')}
        </span>
      ),
      align: 'center',
      dataIndex: 'placeName',
      key: 'placeName',
      render: (data, record) => (
        <div>
          <Switch
            checked={getIsShowForColumn(record.key)} // 使用getIsShowForColumn函数获取当前列的is_show状态
            onChange={data => handleSwitchChange(record, data)}
          />
        </div>
      )
    }
  ]

  const sortedColumns = sortColumnsBySort(tableColumns) // 排序后的列,传递给外部的table
  const [biaotouModal, setBiaotouModal] = useState(false) // 控制表头设置的显示隐藏

  const [sortData, setSortData] = useState() //拿到表头列的显示状态
  // 打开表头设置弹窗
  const biaotouHandle = async () => {
    setBiaotouModal(true)
    const res = await getList7({ type: 3 })
    console.log('res.titleSetContent', res.titleSetContent)
    setSortData(JSON.parse(res.titleSetContent))
  }

  // 排序
  function sortColumnsBySort (columns) {
    return columns.sort((a, b) => a.sort - b.sort)
  }

  // 在渲染Switch的地方,查找当前列对应的is_show值
  const getIsShowForColumn = columnName => {
    return sortData?.find(item => item.name === columnName)?.is_show ?? true // 如果找不到,默认为true
  }

  // 当拖拽和显示和隐藏后外部表格更新
  useEffect(() => {
    if (sortData) {
      const updateAndHandleResponse = async () => {
        const res = await getEditMethod3({
          titleSetContent: JSON.stringify(sortData),
          type: 3
        })

        localStorage.setItem('hiddenColumns1', JSON.stringify(sortData))

        const updatedColumns = tableColumns.map(column => {
          if (
            sortData.find(
              item => item.name === column.key && item.is_show === false
            )
          ) {
            return { ...column, hidden: true }
          } else if (
            sortData.find(
              item => item.name === column.key && item.is_show === true
            )
          ) {
            return { ...column, hidden: false }
          }
          return column
        })

        setTableColumns(updatedColumns)
      }
      updateAndHandleResponse()
    }
  }, [sortData, biaotouModal])

  // 当拖拽和显示和隐藏后外部表格更新
  useEffect(() => {
    const storedHiddenColumns = localStorage.getItem('hiddenColumns1')

    if (storedHiddenColumns) {
      const hiddenColumns = JSON.parse(storedHiddenColumns)

      const updatedTableColumns = tableColumns.map(column => {
        if (
          hiddenColumns.find(
            item => item.name === column.key && item.is_show === false
          )
        ) {
          return { ...column, hidden: true }
        } else if (
          hiddenColumns.find(
            item => item.name === column.key && item.is_show === true
          )
        ) {
          return { ...column, hidden: false }
        }
        return column
      })

      setTableColumns(updatedTableColumns)
    }

    return () => {

    }
  }, [])

------------------------------------------------这是表头设置的table 和 外部的table 和 拖拽代码--------------
 

 // 表头设置里的table      
      <DndContext
                    modifiers={[restrictToVerticalAxis]}
                    onDragEnd={onDragEnd}
                  >
                    <SortableContext
                      items={biaotouData.map(i => i?.key)}
                      strategy={verticalListSortingStrategy}
                    >
                      <SimpleBar
                        style={{
                          maxHeight: '600px',
                          overflowY: 'auto',
                          display: 'block'
                        }}
                        className='SimpleBar'
                      >
                        <Table
                          columns={biaotouColumns}
                          dataSource={biaotouData}
                          loading={loading}
                          pagination={false}
                          components={{
                            body: {
                              row: Row1
                            }
                          }}
                          rowKey='key'
                        ></Table>
                      </SimpleBar>
                    </SortableContext>
                  </DndContext>



// 外部的table
     {TableCom2({ loading, data, columns: sortedColumns })}


  //被拖拽后
  const onDragEnd = ({ active, over }) => {
    console.log('active', active)
    if (active.id !== over?.id) {
      setBiaotouData(biaotouData => {
        const activeIndex = biaotouData.findIndex(
          item => item?.key === active.id
        )
        const overIndex = biaotouData.findIndex(item => item?.key === over?.id)

        const newData = arrayMove(biaotouData, activeIndex, overIndex).map(
          (item, index) => ({
            ...item,
            sort: index + 1
          })
        )
        // 创建一个新的映射以方便查找
        const keyToSortMap = newData.reduce((map, item) => {
          map[item.key] = item.sort
          return map
        }, {})
        console.log('keyToSortMap', keyToSortMap)

        // 遍历sortData,根据name查找对应的新Data中的sort值并赋值
        sortData.forEach(item => {
          if (item.name in keyToSortMap) {
            item.sort = keyToSortMap[item.name]
          }
        })

        // 遍历sortData,根据name查找对应的新Data中的sort值并赋值
        tableColumns.forEach(item => {
          if (item.key in keyToSortMap) {
            item.sort = keyToSortMap[item.key]
          }
        })
        setTableColumns(tableColumns)
        localStorage.setItem('hiddenColumns1', JSON.stringify(sortData))

        console.log('Updated sortData:', sortData)
        console.log('sortData', sortData)
        console.log('newData', newData)
        console.log('tableColumns', tableColumns)

        getEditMethod3({
          titleSetContent: JSON.stringify(sortData),
          type: 3
        })

        return arrayMove(biaotouData, activeIndex, overIndex)
      })
    }
  }


//控制是否可以选中表格里的文字
const Row1 = props => {
  const {
    attributes,
    listeners,
    setNodeRef,
    setActivatorNodeRef,
    transform,
    transition,
    isDragging
  } = useSortable({
    id: props['data-row-key']
  })
  const style = {
    ...props.style,
    transform: CSS.Translate.toString(transform),
    transition,
    ...(isDragging
      ? {
          position: 'relative',
          zIndex: 9999
        }
      : {})
  }
  const contextValue = useMemo(
    () => ({
      setActivatorNodeRef,
      listeners
    }),
    [setActivatorNodeRef, listeners]
  )
  return (
    <RowContext.Provider value={contextValue}>
      <tr {...props} ref={setNodeRef} style={style} {...attributes} />
    </RowContext.Provider>
  )
}

//拖拽图标
const DragHandle = () => {
  const { setActivatorNodeRef, listeners } = useContext(RowContext)
  return (
    <Button
      type='text'
      size='small'
      icon={<HolderOutlined />}
      style={{
        cursor: 'move'
      }}
      ref={setActivatorNodeRef}
      {...listeners}
    />
  )
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/704832.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【应用案例】如何解决无人驾驶车辆的动力转向问题

埃尔朗根-纽伦堡大学名称为高能赛车运动队(High-Octane Motorsports e.V.)的学生方程式车队都设计、构建和制造具有创新意义且独特的赛车。然后&#xff0c;他们将参加三种不同类别的大学生方程式比赛&#xff1b;该项赛事中的参赛队伍来自于世界各地。 电动、无人驾驶和燃油车…

17.路由配置与页面创建

路由配置与页面创建 官网&#xff1a;https://router.vuejs.org/zh/ Vue Router 和 组合式 API | Vue Router (vuejs.org) 1. 修改index.ts import { RouteRecordRaw, createRouter, createWebHistory } from "vue-router"; import Layout from /layout/Index.vueco…

python长方形周长面积 2024年3月青少年编程电子学会python编程等级考试二级真题解析

目录 python长方形周长面积 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python长方形周长面积 2024年3月 python编程等级考试级编程题 一、…

linux系统宝塔服务器temp文件夹里总是被上传病毒php脚本

目录 简介 上传过程 修复上传漏洞 tmp文件夹总是被上传病毒文件如下图: 简介 服务器时不时的会发送短信说你服务器有病毒, 找到了这个tmp文件, 删除了之后又有了。 确实是有很多人就这么无聊, 每天都攻击你的服务器。 找了很久的原因, 网上也提供了一大堆方法,…

天锐绿盾 | 无感知加密软件、透明加密系统、数据防泄漏软件

摘要&#xff1a;文件加密软件,包含禁止非授权的文件泄密和抄袭复制解决方案即使被复制泄密都是自动加密无法阅读,透明加密,反复制软件,内网监控,文件加密,网络安全方案,透明文件加密,加密文件,图纸加密,知识产权保护,加密数据; 通过绿盾信息安全管理软件&#xff0c;系统在不改…

2024/06/13--代码随想录算法2/17| 62.不同路径、63. 不同路径 II、343. 整数拆分 (可跳过)、96.不同的二叉搜索树 (可跳过)

62.不同路径 力扣链接 动态规划5步曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a; dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) 有dp[i][j]条不同的路径。确定递推公式&#xff0c;dp[i][j] d…

Java——递归

一、递归介绍 1、什么是递归 递归在Java编程中是指一个方法调用自身的编程技巧。 public static void foo() {//...foo();//方法调用自身//...} 2、递归用于什么场景 递归是一种常见的算法设计方法&#xff0c;特别适用于解决那些可以分解为相似子问题的问题。常见的递归问…

诺派克ROPEX控制器维修RES-5008 RES-5006

德国希尔科诺派克ROPEX热封控制器维修型号包括&#xff1a;RES-401&#xff0c;RES-402&#xff0c;RES-403&#xff0c;RES-406&#xff0c;RES-407&#xff0c;RES-408&#xff0c;RES-409&#xff0c;RES-420&#xff0c;RES-440&#xff0c;RES-5008&#xff0c;RES-5006&a…

阿里三面:Redis大key怎么处理?

阿里三面&#xff1a;Redis大key怎么处理&#xff1f; 一、什么是大key&#xff1f; 首先大key不是key很大而是key对应的value值很大,一般而言如果String类型值大于10KB&#xff0c;Hash&#xff0c;Set&#xff0c;Zset&#xff0c;List类型的元素的个数大于5000个都可以称之…

18. 《C语言》——【Nice2016年校招笔试题引发的思考】

亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&#xff0c;成为一名优…

中国版Sora?快手「可灵」到底行不行?

“可灵”与Sora有相似的技术架构&#xff0c;生成的视频动作流畅、幅度大&#xff0c;对物理世界理解力与还原度很高。可生成120秒、每秒30帧的高清视频&#xff0c;分辨率高达1080p&#xff0c;并且支持多种不同的屏幕比例。 “中国版SORA”到底是不是名副其实&#xff1f;能…

谷歌浏览器124版本Webdriver驱动下载

查看谷歌浏览器版本 在浏览器的地址栏输入&#xff1a; chrome://version/回车后即可查看到对应版本(不要点击帮助-关于Google chrome&#xff0c;因为点击后会自动更新谷歌版本) 114之前版本&#xff1a;下载链接 ​​​​​​123以后版本&#xff1a;下载链接&#xff0…

【机器学习】通用大模型VS垂直大模型,你更加青睐哪一方?

目录 前言AI大模型的战场&#xff1a;通用与垂直的分化通用大模型&#xff1a;广泛适用的利器垂直大模型&#xff1a;深入领域的利器谁能够形成绝对优势&#xff1f;结语通用大模型文章推荐 前言 AI大模型的战场正在分化&#xff1a; 通用大模型在落地场景更广泛毋庸置疑&…

idea插件开发之实现设置信息持久化存储

写在前面 在idea中设置的信息&#xff0c;我们重启idea后&#xff0c;这些信息还是在的&#xff0c;这其实是通过idea插件的持久化存储功能实现的&#xff0c;本文一起来看下如何实现。 1&#xff1a;正戏 为了方便测试&#xff0c;首先定义如下的ui: 我们需要在代码中给按…

干货分享:宏集物联网HMI通过S7 MPI协议采集西门子400PLC数据

前言 为了实现和西门子PLC的数据交互&#xff0c;宏集物联网HMI集成了S7 PPI、S7 MPI、S7 Optimized、S7 ETH等多个驱动来适配西门子200、300、400、1200、1500、LOGO等系列PLC。 本文主要介绍宏集HMI通过S7 MPI协议采集西门子400PLC数据的操作步骤&#xff0c;其他协议的操作…

C++入门 string的模拟实现

目录 再谈swap string常见接口模拟实现 构造函数 & 析构函数 拷贝构造 & 赋值运算符重载 begin迭代器 & end迭代器 size & swap & clear & c_str operator[ ] & reserve push_back & append operator & find insert & erase…

计算机网络之网络层知识总结

网络层功能概述 主要任务 主要任务是把分组从源端传到目的端&#xff0c;为分组交换网上的不同主机提供通信服务。网络层传输单位是数据报。 分组和数据报的关系&#xff1a;把数据报进行切割之后&#xff0c;就是分组。 主要功能&#xff1a; 路由选择与分组转发 路由器…

openh264 编码器源码分析:WelsCodeOneSlice 函数

介绍 功能&#xff1a;openh264 编码每个 slice 的核心函数原型&#xff1a; int32_t WelsCodeOneSlice (sWelsEncCtx* pEncCtx, SSlice* pCurSlice, const int32_t kiNalType)参数&#xff1a; pEncCtx&#xff1a;指向编码上下文结构体sWelsEncCtx的指针&#xff0c;包含编…

gpt、llama大模型模型结构细节探索

参考&#xff1a; https://github.com/naklecha/llama3-from-scratch&#xff08;一定要看看&#xff09; https://github.com/karpathy/build-nanogpt/blob/master/play.ipynb 视频&#xff1a; https://www.youtube.com/watch?vl8pRSuU81PU https://tiktokenizer.vercel…

Vitis HLS 学习笔记--移除内存分配malloc

目录 1. 简介 2. 示例解析 2.1 源码解释 2.2 malloc 分析 2.3 替代方案分析 3. 总结 1. 简介 Vitis HLS 也不支持动态创建或删除 C/C 对象&#xff08;用于综合&#xff09;。 本文探究如何在C/C代码中避免使用显式的malloc函数来分配内存。在硬件设计和FPGA开发中&…