#Vue 3 + ts + antd table表格的使用(嵌套 子表格版)

news/2024/7/8 4:48:01 标签: vue.js, 前端, javascript

1. 嵌套子表格的使用

在这里插入图片描述

javascript"><template>
  <a-table :columns="columns" :data-source="data" class="components-table-demo-nested">
    <template #bodyCell="{ column }">
      <template v-if="column.key === 'operation'">
        <a>Publish</a>
      </template>
    </template>
    <template #expandedRowRender="{ record }">
      <a-table :columns="innerColumns" :data-source="record.innerData" :pagination="false">
        <template #bodyCell="{ column }">
          <template v-if="column.key === 'state'">
            <span>
              <a-badge status="success" />
              Finished
            </span>
          </template>
          <template v-else-if="column.key === 'operation'">
            <span class="table-operation">
              <a>Pause</a>
              <a>Stop</a>
              <a-dropdown>
                <template #overlay>
                  <a-menu>
                    <a-menu-item>Action 1</a-menu-item>
                    <a-menu-item>Action 2</a-menu-item>
                  </a-menu>
                </template>
                <a>
                  Mores
                  <down-outlined />
                </a>
              </a-dropdown>
            </span>
          </template>
        </template>
      </a-table>
    </template>
  </a-table>
</template>
<script setup lang="ts">

import { DownOutlined } from '@ant-design/icons-vue';
import {fetchOrders} from "@/service/order/order";
import {CTYPE, Utils} from "@/utils";

const columns = [
  { title: '联系人', dataIndex: 'contacts', key: 'contacts' },
  { title: '创单时间', dataIndex: 'createOrderTime', key: 'createOrderTime' },
  { title: '订单状态', dataIndex: 'orderStatus', key: 'orderStatus' },
  { title: '订单类型', dataIndex: 'orderType', key: 'orderType' },
  { title: '订单id', dataIndex: 'ordersId', key: 'ordersId' },
  { title: '原始金额', dataIndex: 'originAmount', key: 'originAmount' },
  { title: '支付时间', dataIndex: 'payTime', key: 'payTime' },
  { title: '实收金额', dataIndex: 'receiptAmount', key: 'receiptAmount' },
  { title: '商品名称', dataIndex: 'skuName', key: 'skuName' },
  { title: '商品类型', dataIndex: 'skuType', key: 'skuType' },
  { title: '状态', dataIndex: 'status', key: 'status' },
  { title: '操作', key: 'operation' },
];
// 请求数据源 的数据类型 
interface DataItem {
  key: number;
  name?: string;
  platform?: string;
  version?: string;
  upgradeNum?: number;
  creator?: string;
  createdAt?: string;

  certificate?: string;
  contacts?: string;
  createOrderTime?: number;
  orderStatus?: number;
  orderType?: number;
  ordersId?: string;
  originAmount?: number;
  payTime?: number;
  receiptAmount?: number;
  skuName?: string;
  skuType?: string;
  status?: number;
  innerData: innerDataItem[]; // 新增属性
}
// 子表格
interface innerDataItem {
  key: number;
  order_item_id: string;
  certificate_id: string;
  item_status: number;
  item_update_time: number;
  refund_amount: number;
  refund_time: number;
}

// 分页的一些内容,对demo 可以忽略
const pagination = ref<COMMON.Pageable>({
  pageSize: CTYPE.pagination.pageSize,
  current: 1,
  total: 0
});
const orderQo = reactive<ORDER.OrderQo>({
  status: 1,
  sortPropertyName: 'id',
  sortAscending: false
});


// 响应数据
let contentData  = reactive<any>([]);
const data: DataItem[] = reactive([]);
const innerData: innerDataItem[] = reactive([]);


const innerColumns = [
  { title: '券维度的订单号', dataIndex: 'order_item_id', key: 'order_item_id' },
  { title: '券码号', dataIndex: 'certificate_id', key: 'certificate_id' },
  { title: '券维度订单状态', dataIndex: 'item_status',key: 'item_status' },
  { title: '退款金额', dataIndex: 'item_update_time', key: 'item_update_time' },
  { title: '退款时间', dataIndex: 'refund_amount', key: 'refund_amount' },
  { title: '券维度订单更新时间', dataIndex: 'refund_time', key: 'refund_time' },
  {
    title: 'Action',
    dataIndex: 'operation',
    key: 'operation',
  },
];
// 加载数据
const loadData = async () => {
  try {
    const result = await fetchOrders({
      ...orderQo,
      pageNumber: pagination.value.current,
      pageSize: pagination.value.pageSize,
    }) as ORDER.OrderPager;
    const { content = [] } = result;
    // 重点:获取到后台数据后,对数据进行处理,请重点看下面的数据处理思路!!!
    contentData = content;

    // 重置 data 和 innerData
    data.length = 0;
    innerData.length = 0;
    // 遍历数据
    for (let i = 0; i < contentData.length; ++i) {
      const outerItem: DataItem = {
        key: i,
        contacts: contentData[i].contacts,
        createOrderTime: contentData[i].createOrderTime,
        orderStatus: contentData[i].orderStatus,
        orderType: contentData[i].orderType,
        ordersId: contentData[i].ordersId,
        originAmount: contentData[i].originAmount /100  ,
        payTime: contentData[i].payTime,
        receiptAmount: (contentData[i].receiptAmount /100) ,
        skuName: contentData[i].skuName,
        skuType: contentData[i].skuType,
        status: contentData[i].status,
        innerData: [], // 初始化内层数据为空数组
      };

      // 解析当前订单的数据
      let jsondata: Array<{
        key: number;
        certificate_id: string;
        order_item_id: string;
        refund_time: number;
        refund_amount: number;
        item_status: number;
        item_update_time: number;
      }> = [];

      try {
        jsondata = JSON.parse(contentData[i].certificate);
      } catch (error) {
        console.error(`Failed to parse certificate data of order at index ${i}:`, error);
        continue; // 如果解析失败,跳过该订单
      }
      // 填充内层数据并将其关联到外层数据项
      for (let k = 0; k < jsondata.length; ++k) {
        outerItem.innerData.push({
          key: k,
          order_item_id: jsondata[k].order_item_id,
          certificate_id: jsondata[k].certificate_id,
          item_status: jsondata[k].item_status,
          item_update_time: jsondata[k].item_update_time,
          refund_amount: jsondata[k].refund_amount,
          refund_time: jsondata[k].refund_time,
        });

      }
      // 将外层数据项添加到 data 数组中
      data.push(outerItem);
      console.log("innerDatas的值", outerItem.innerData);
    }
  } catch (error) {
    // loading.value = false;
  }
}

// 初始化渲染数据
// onMounted 生命周期钩子会在组件挂载后立即执行,确保在组件渲染前完成数据的获取和初始化工作,进而使得内外层表格能正确渲染数据
onMounted(async () => {
  await loadData();
});

</script>



http://www.niftyadmin.cn/n/5536498.html

相关文章

WCCI 2024第三弹:忍者表演惊艳全场,盛大晚宴不容错过

WCCI 2024第三弹&#xff1a;忍者表演惊艳全场&#xff0c;盛大晚宴不容错过&#xff01; 会议之眼 快讯 会议介绍 IEEE WCCI&#xff08;World Congress on Computational Intelligence&#xff09;2024&#xff0c;即2024年IEEE世界计算智能大会&#xff0c;于6月30日至7月…

LabVIEW航空用电缆检测

系统通过集成LabVIEW平台&#xff0c;实现了航空用电缆检测过程中的自动数据收集、处理和报告生成&#xff0c;显著提升了检测效率和数据准确性&#xff0c;降低了人工干预&#xff0c;提高了电缆检测的可靠性。 项目背景 在航空领域&#xff0c;电缆的质量检测对确保飞机及其…

地铁车厢火灾3D模拟逃生演习减少了资源损耗和风险

在消防安全领域&#xff0c;为了更好地提升安全实训效果&#xff0c;我们在VR安全培训领域打造了多款消防安全VR模拟实训系统&#xff0c;不仅实现了与现实世界无异的交互操作&#xff0c;更在虚拟空间中超越了现实的限制&#xff0c;模拟出那些现实中难以搭建的复杂场景。 利用…

【Unity navmeshaggent 组件】

【Unity navmeshaggent 组件】 组件概述&#xff1a; NavMeshAgent是Unity AI系统中的一个组件&#xff0c;它允许游戏对象&#xff08;通常是一个角色或AI&#xff09;在导航网格&#xff08;NavMesh&#xff09;上自动寻路。 组件属性&#xff1a; Radius&#xff1a;导航…

比尔・盖茨谈AI市场狂热现象;腾讯推出TransAgents文学翻译框架

&#x1f989; AI新闻 &#x1f680; 比尔・盖茨谈AI市场狂热现象 摘要&#xff1a;微软联合创始人比尔・盖茨在《下一个伟大的构想》播客节目中表示&#xff0c;目前AI市场的狂热程度远超互联网泡沫&#xff0c;准入门槛低&#xff0c;融资额巨大&#xff0c;处于前所未见的…

Web与App测试:深入解析两者的关键差异

1. 架构不同 Web测试&#xff1a;基于B/S&#xff08;Browser/Server&#xff0c;浏览器/服务器&#xff09;架构&#xff0c;用户通过浏览器访问服务器上的资源&#xff0c;无需在本地安装额外的客户端软件。App测试&#xff1a;基于C/S&#xff08;Client/Server&#xff0c…

安全和加密常识(1)对称加密和非对称加密以及相应算法

文章目录 对称加密(Symmetric Encryption)非对称加密(Asymmetric Encryption)使用场景和优缺点对称加密和非对称加密是信息安全领域中两种重要的加密方式,它们分别使用不同的加密算法和密钥管理方式来保护数据的机密性。下面我来简单介绍一下它们及其相应的算法。 对称加…

关于pytorch的加载数据,cpu init, cpu getitem, gpu init

文章目录 一. (cpu,init)图像加载到CPU内存&#xff0c;是在 __init__中函数中全部数据, 然后在item中取图像二.(cpu,get_item)是图像在 get_item函数中&#xff0c;载入图像到CPU三(gpu,init)是将图像加载到GPU, 在init函数中 跑多光谱估计的代码&#xff0c;参考&#xff1a;…