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

vue3table列表合并列相同数据

弹窗内table,合并第一列和第二列相同数据

<script setup lang="ts">
import { onMounted, PropType, reactive, ref, watch } from 'vue'
import { useTable } from '@/hooks/web/useTable'
import { getfuncListbyId } from '@/api/DockingManagement/index'
import { Table } from '@/components/Table'
import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas'
const props = defineProps({
  currentRow: {
    type: Object as any,
    default: () => undefined
  }
})

// 列表
const PageList = async () => {
  const res = await getfuncListbyId(props.currentRow.id)
  return {
    list: res.data,
    total: 0
  }
}
const { tableRegister, tableState } = useTable({
  fetchDataApi: async () => {
    const res = await PageList()
    return {
      list: res.list || [],
      total: 0
    }
  }
})
const { loading, dataList } = tableState

const crudSchemas = reactive<CrudSchema[]>([
  {
    field: 'primaryModule',
    label: '一级模块',
    form: {
      hidden: true
    },
    search: {
      hidden: true
    },
    detail: {
      hidden: true
    },
    table: {
      hidden: false
    }
  },
  {
    field: 'secondaryModule',
    label: '二级模块',
    form: {
      hidden: true
    },
    search: {
      hidden: true
    },
    detail: {
      hidden: true
    },
    table: {
      hidden: false
    }
  },
  {
    field: 'name',
    label: '能力名称',
    form: {
      hidden: true
    },
    search: {
      hidden: true
    },
    detail: {
      hidden: true
    },
    table: {
      hidden: false
    }
  },
])
const { allSchemas } = useCrudSchemas(crudSchemas)

// 存放所有的表头 一定要与dataList.value一致
const colFields = reactive<string[]>([
  'primaryModule',
  'secondaryModule',
  'name',
  'code',
  'description'
])

// 合并单元格的方法
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
  // 合并一样的班级列 primaryModule属性
  if (columnIndex === 0) {
    if (
      rowIndex === 0 ||
      (rowIndex > 0 && row.primaryModule !== dataList.value[rowIndex - 1]?.primaryModule)
    ) {
      let rowspan = 1
      for (let i = rowIndex + 1; i < dataList.value.length; i++) {
        if (dataList.value[i].primaryModule === row.primaryModule) {
          rowspan++
        } else {
          break
        }
      }
      return { rowspan, colspan: 1 }
    } else {
      return { rowspan: 0, colspan: 0 }
    }
  }

  // 合并一样的性别列 secondaryModule属性
  if (columnIndex === 1) {
    if (
      rowIndex === 0 ||
      (rowIndex > 0 && row.secondaryModule !== dataList.value[rowIndex - 1]?.secondaryModule)
    ) {
      let rowspan = 1
      for (let i = rowIndex + 1; i < dataList.value.length; i++) {
        if (dataList.value[i].secondaryModule === row.secondaryModule) {
          rowspan++
        } else {
          break
        }
      }
      return { rowspan, colspan: 1 }
    } else {
      return { rowspan: 0, colspan: 0 }
    }
  }
}
</script>

<template>
  <Table
    :spanMethod="objectSpanMethod"
    :columns="allSchemas.tableColumns"
    :data="dataList"
    :loading="loading"
    @register="tableRegister"
    height="53vh"
    border
  />
</template>


http://www.kler.cn/a/579798.html

相关文章:

  • VSCode离线安装Verilog插件教程
  • 面试题之react useMemo和uesCallback
  • win10电脑鼠标速度突然变的很慢?
  • Skyvern AI 实现 浏览器爬虫+自动化工具
  • 【性能测试】Jmeter详细操作-小白使用手册(2)
  • DeepSeekR1之五_RAGFlow中配置DeepSeekR1模型时错误问题及处理
  • WPF 在图像编辑工具开发中的优势
  • 【Proteus仿真】【STM32单片机】家用电计量系统
  • Qt:界面优化
  • Ubuntu 22.04 官方下载安装 Gradle 记录
  • 如何修复“RPC 服务器不可用”错误
  • 本地部署Navidrome个人云音乐平台随时随地畅听本地音乐文件
  • 数据结构 -图 -基础
  • 媲美Deepseek R1 671B的千问QwQ32B本地部署与远程访问实测流程
  • mitmproxy配合Wireshark 抓包分析
  • conda list <package> 指令输出的build和channel含义
  • 电力行业中分布式能源管理(Distributed Energy Management System, DEMS)的实现
  • 【每日学点HarmonyOS Next知识】底部弹窗、对话框不弹出、多模块间跳转、输入框不显示内容、Grid编辑顺序
  • QT系列教程(17) MVC结构之Model模型介绍
  • Spring-全面详解(学习总结)