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

news2024/11/18 0:34:48

1. 嵌套子表格的使用

在这里插入图片描述

<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.coloradmin.cn/o/1896942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文写作全攻略:Kimi辅助下的高效学术写作技巧

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 完成论文写作是一个多阶段的过程&#xff0c;涉及到不同的任务和技能。以下是按不同分类总结的向Kimi提问的prompt&#xff0c;以帮助你在论文写作过程中取得成功&#xff1a; 1. 选题与…

Redis 7.x 系列【19】管道

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 往返时间2. 管道技术3. 代码演示4. 其他批处理4.1 原生批处理命令4.2 事务4.3 脚本…

华大基因乌拉圭实验室启航:中国技术赋能拉美精准医学发展

乌拉圭作为加入“一带一路”倡议的国家&#xff0c;多年来&#xff0c;与中国在经贸、教育、文化和科技等多个关键领域的合作不断深化与拓展。随着“共建‘健康丝绸之路’倡议”的深化落实&#xff0c;中乌两国在医疗卫生领域的合作也迈入了新阶段。作为中国基因行业的奠基者&a…

大型能源电力集团需要什么样的总部数据下发系统?

能源电力集团的组织结构是一个复杂的系统&#xff0c;包括多个职能部门和子分公司。这些子分公司负责具体的电力生产、销售、运维等业务。这些部门和公司协同工作&#xff0c;确保电力生产的顺利进行&#xff0c;同时关注公司的长期发展、市场拓展、人力资源管理、财务管理和公…

C#实战|账号管理系统:通用登录窗体的实现。

哈喽,你好啊,我是雷工! 本节记录登录窗体的实现方法,比较有通用性,所有的项目登录窗体实现基本都是这个实现思路。 一通百通,以下为学习笔记。 01 登录窗体的逻辑 用户在登录窗输入账号和密码,如果输入账号和密码信息正确,点击【登录】按钮,则跳转显示主窗体,同时在固…

属性描述符初探——Vue实现数据劫持的基础

目录 属性描述符——Vue实现数据劫持的基础 一、属性描述符是什么&#xff1f; ​编辑 1.1、属性描述符示例 1.2、用属性描述符定义属性及获取对象的属性描述符 1.3、带有读取器和设置器的属性描述符 二、使用属性描述符的情景 2.1、封装和数据隐藏 使用getter和setter…

Node之Web服务

前言 本文将讲解node的web服务 通过讲解http请求&#xff0c;node创建web服务等知识点让你更加深入的理解web服务和node创建的web服务 HTTP请求是什么&#xff1f; HTTP请求是客户端&#xff08;通常是浏览器或其他应用程序&#xff09;与服务器之间进行通信的一种方式。 …

onclick和@click有什么区别,究竟哪个更好使?

哈喽小伙伴们大家好,我是爱学英语的程序员,今天来给大家分享一些关于vue中事件绑定相关的内容,希望对大家有所帮助. 场景是这样的:我要实现一个切换栏,默认激活的是第一个标签,当鼠标移动到第二个标签是,对应的内容让激活.起初,我第一时间想到的是用element plus的组件来实现这…

从“NLP技术”到“AI大模型”

自从AI大模型问世以来&#xff0c;仿佛很少有人提及NLP技术这个词了。昨天休息的时候突然在想一个问题&#xff0c;AI大模型已经如此强大了&#xff0c;还需要传统的NLP技术吗&#xff1f; 传统的NLP技术指&#xff1a;从分词&#xff08;ws&#xff09;、词性标注&#xff08;…

【半导体行业推荐】PFA酸纯化器 特氟龙材质 酸蒸馏仪

PFA酸纯化器是一种实验室设备&#xff0c;专门用于制备高纯度的酸&#xff0c;这些高纯酸在化学分析、材料科学、半导体制造、光伏产业、生物医学研究等领域有着重要应用。以下是PFA酸纯化器的一些关键特性和功能&#xff1a; 1. 高效提纯&#xff1a;PFA酸纯化器通过先进的膜…

go语言day09 通道 协程的死锁

Go语言学习——channel的死锁其实没那么复杂 - JackieZheng - 博客园 (cnblogs.com) 目录 通道 创建通道 1&#xff09;无缓冲通道 2&#xff09;有缓冲通道 通道的使用 1) 值从通道入口进 2) 值从通道出口出 信道死锁&#xff1a; 0&#xff09;死锁现场0 1&#xff09;死…

Twitter批量发送消息api接口如何申请配置?

Twitter批量发送消息API接口的功能&#xff1f;接口有哪些限制&#xff1f; 企业和开发者越来越多地需要在Twitter上批量发送消息。然而&#xff0c;申请和配置这个接口需要一定的步骤和注意事项。AokSend将详细介绍如何申请和配置Twitter批量发送消息API接口。 Twitter批量发…

静力水准仪:测量与安装的全面指南

静力水准仪作为一种高精度的测量仪器&#xff0c;广泛应用于管廊、大坝、核电站、高层建筑、基坑、隧道、桥梁、地铁等工程领域&#xff0c;用于监测垂直位移和倾斜变化。本文将详细介绍静力水准仪的工作原理、特点及其安装过程中的注意事项&#xff0c;旨在为相关工程人员提供…

sql业务场景分析思路参考

1、时间可以进行排序&#xff0c;也可以用聚合函数对时间求最大值max&#xff08;时间&#xff09; 例如下面的例子&#xff1a;取最晚入职的人&#xff0c;那就是将入职时间倒序排序&#xff0c;然后limit 1 表&#xff1a; 场景&#xff1a;查找最晚入职员工的所有信息 se…

maven项目、idea抽风问题解决

开发的时候遇到奇奇怪怪的非技术问题&#xff0c;解决起来会费时间&#xff0c;做无用功。   这里记录常见的情况和解决方法 1.未识别maven项目 文件的图标变成了这种橙色的&#xff0c;而且有主启动函数也不能run 右键pom文件&#xff0c;点击Add as Maven Project 如果…

215. 数组中的第K个最大元素(中等)

215. 数组中的第K个最大元素 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;215. 数组中的第K个最大元素 2.详细题解 快速排序算法在每一轮排序中&#xff0c;随机选择一个数字 x x x&#xff0c;根据与 x x x的大小关系将要排序的数…

C++ 引用——引用的基本语法

引用的基本使用 作用&#xff1a;给变量起别名 语法&#xff1a;数据类型 &别名 原名 示例&#xff1a; 运行结果&#xff1a;

【网络安全】漏洞挖掘之Spring Cloud注入漏洞

漏洞描述 Spring框架为现代基于java的企业应用程序(在任何类型的部署平台上)提供了一个全面的编程和配置模型。 Spring Cloud 中的 serveless框架 Spring Cloud Function 中的 RoutingFunction 类的 apply 方法将请求头中的“spring.cloud.function.routing-expression”参数…

【微信小程序开发实战项目】——花店微信小程序实战项目(4)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…