vue3 组合式 ant.design组件Table嵌套表格,从后端获取数据并动态渲染

Vue + ant design 实现嵌套子表格 添加主表格一行;添加某个子表格一行;子表格数据的异步加载。 阅读详情
AI摘要

本文介绍了在使用AntDesign框架开发时遇到的嵌套表格问题,包括如何从父表获取数据、获取子表行索引以及设置子表数据源。作者通过示例代码展示了如何处理后端返回的JSON数据,将数据转化为前端渲染所需的格式,并实现了子表数据与父表关联的功能。

在根据官方文档使用ant.design中的嵌套表格时,发现官方文档很多地方都不够详细。在过程中踩了不少坑,例如:

子表如何获取父表的数据?

如何获取子表的行索引?

如何让子表的数据源来自父表该行的数据?

总之,最后还是磕磕绊绊做完了功能,于是第一时间把代码整理出来以作分享。

首先,后端返回的数据是json格式。

后端返回数据格式如下:

{
    "result": true,
    "errorCode": null,
    "errorMsg": null,
    "data": [
        {
            "id": "001",
            "name": "A",
            "releaseVersion": "v2.00.02",
            "subSystem": "a",
            "type": "edit",
            "history": [
                {
                    "editVersion": 1,
                    "timestamp": "2023/05/08 12:23",
                    "comment": "备注1.1"
                },
                {
                    "editVersion": 2,
                    "timestamp": "2023/05/08 12:23",
                    "comment": "备注1.2"
                }
            ]
        },
        {
            "id": "002",
            "name": "B",
            "releaseVersion": "v2.00.01",
            "subSystem": "b",
            "type": "edit",
            "history": [
                {
                    "editVersion": 1,
                    "timestamp": "2023/05/08 12:23",
                    "comment": "备注2.1"
                },
                {
                    "editVersion": 2,
                    "timestamp": "2023/05/08 12:23",
                    "comment": "备注2.2"
                }
            ]
        }
    ],
    "recordsTotal": 123
}

前端渲染的数据格式如下:

[
    {
        "key": 0,
        "name": "A",
        "subSystem": "a",
        "type": "edit",
        "expand": " ",
        "innerDatas": [
            {
                "key": 0,
                "ID": "001",
                "version": "v2.00.021",
                "editComment": "备注1.1",
                "editTime": "2023/05/08 12:23",
                "more": " "
            },
            {
                "key": 0,
                "ID": "001",
                "version": "v2.00.022",
                "editComment": "备注1.2",
                "editTime": "2023/05/08 12:23",
                "more": " "
            }
        ]
    },
    {
        "key": 1,
        "name": "B",
        "subSystem": "b",
        "type": "edit",
        "expand": " ",
        "innerDatas": [
            {
                "key": 1,
                "ID": "002",
                "version": "v2.00.011",
                "editComment": "备注2.1",
                "editTime": "2023/05/08 12:23",
                "more": " "
            },
            {
                "key": 1,
                "ID": "002",
                "version": "v2.00.012",
                "editComment": "备注2.2",
                "editTime": "2023/05/08 12:23",
                "more": " "
            }
        ]
    }
        ]

代码:

<template>

    <div id="main">

        <a-table>

            <template #expandedRowRender="{record}"> 
//这一行代码的意思是添加了一个插槽,#expandedRowRender="{record, index, indent, expanded}",template里面的元素可以使用大括号内的值。其中record是父表内一行的数据,index是行的索引,indent是缩进,expanded表示是否展开。

                <div class="child">

                    <a-table :columns="innerColumns" :data-source="record.innerDatas" >


//表示子表的数据源来自父表record一行数据的innerDatas

                        <template #bodyCell="{ text, record, index, column}"> 
//text表示该行该列也就是这个单元格内的值,record表示子表一行的数据,index表示子表行的索引,column表示子表的列。同样的,该插槽放在父表内表示的就是父表的数据。

                            <template v-if="column.key === 'more'"> 
//这表示子表里column.key为more的这一列,都显示“详细”

                                   <a @click="cilikRow = index, modalVisible = cilikRow > -1" >

                                    详细

                                </a>

                            </template>

                        </template>

                    </a-table>

                    <div class="createModel" ref="createModel">

                        <a-modal v-model:visible="modalVisible" title=" ">

                            <p class="modal-editComment">{{ dataList[0].innerDatas[cilikRow.valueOf()].editComment }}</p> 


//一个a-modal弹窗,当点击“详细”时显示子表中editComment的内容

                        </a-modal>

                    </div>

                </div>

            </template>

        </a-table>

    </div>

</template>

<script lang="ts">

import { DownOutlined } from '@ant-design/icons-vue';

import { defineComponent } from 'vue';

import axios from 'axios';



const cilikRow = ref<Number>(-1)

const columns = [ //父表的列设置

    { title: '标题', dataIndex: 'name', key: 'name', className: 'thChange', width: 400 },

    { title: '副标题', dataIndex: 'subSystem', key: 'subSystem', className: 'thChange', width: 400 },

    { title: '类型', dataIndex: 'type', key: 'type', className: 'thChange', width: 550 },

    { title: '  ', dataIndex: 'expand', key: 'expand', className: 'thChange', expandFixed: 'right' },

];

const innerColumns = [ //子表的列设置

    { title: 'ID', dataIndex: 'ID', key: 'ID', className: 'thColor', width: 100 },

    { title: '版本', dataIndex: 'version', key: 'version', width: 100 },

    { title: '编辑备注', dataIndex: 'editComment', key: 'editComment', ellipsis: true, width: 250 },

    { title: '编辑日期', dataIndex: 'editTime', key: 'editTime', width: 150 },

    { title: '', dataIndex: 'more', key: "more" }

];

interface DataItem { //父表的数据类型定义,我在这里直接把子表的内容放在了父表中

    key: number;

    name: string;

    subSystem: string;

    type: string;

    expand: any;

    innerDatas: innerDataItem[]

}

interface innerDataItem { //子表的数据类型定义

    key: number;

    ID: string;

    version: string;

    editComment: string;

    editTime: string;

    more: string

}

let innerData= reactive<Array<innerDataItem>>([])  //定义一个innerDataItem类型的响应式数组存放子表的数据

const dataList = reactive<Array<DataItem>>([]) //定义一个DataItem类型的响应式数组存放父表的数据

axios.get('http://127.0.0.0/Test/Test123.json')

    .then((res) => {

        for (let i = 0; i < res.data.data.length; i++) {

            innerData = [];    //每次循环将子表数据清空 确保子表数组中的只有父表这一行对应的子表数据而不是子表所有的数据

            for (let j = 0; j < res.data.data[i].history.length; j++) { //子表数据存入

                    innerData.push({

                        key: i,

                        ID: res.data.data[i].id,

                        version: res.data.data[i].releaseVersion + res.data.data[i].history[j].editVersion,

                        editComment: res.data.data[i].history[j].comment,

                        editTime: res.data.data[i].history[j].timestamp,

                        more: " "

                    })

                }



            dataList.push({ //父表数据存入

                key: i,

                name: res.data.data[i].name,

                subSystem: res.data.data[i].subSystem,

                type: res.data.data[i].type,

                expand: " ",

                innerDatas:innerData               

            })                     

        }      

        console.log(dataList)

    })

const modalVisible = ref<boolean>(false);

export default defineComponent({

    components: {

        DownOutlined,

    },

    setup() {

        return {

            modal: false,

            centerDialogVisible: false,

            modalVisible,

            dataList,

            columns,

            innerColumns,

            innerData,

            cilikRow,

        };

    },

});

</script>

Vue3+Ts结合ant-design+tailwindcss来实现一个复杂表格数据的渲染,包括查看和表格表单提交 阅读详情

相关推荐

vue3 + antd Table组件排序filters、筛选sorter、自定义表头展示

antd Table组件使用筛选、排序、自定义设置表头显示

agua001的博客 8993

vue3.0+Ant Design Vue后台crm管理系统admin

使用了Vue3.0全家桶、ant-design-vue2.0,实践vue3.0的新特性以及玩法,vue3.0的Composition API相比于vue2.0的Options API 灵活很多,让我们可以灵活地组合组件逻辑,目前后端admin大部分还是vue2.6;但是未来被vue3取代是大势所趋,望早上岸!

Vue中后台表格组件选型实战:Element Plus、VXE-Table与ant-design-vue对比

在中后台Vue项目开发中,表格组件往往是承接业务逻辑的核心载体,而面对Element Plus、VXE-Table与ant-design-vue三套主流方案,开发者常因数据规模与交互复杂度判断失误而踩坑。文章从通用表格性能痛点切入,解析虚拟滚动在超大数据量场景下的关键作用,对比各组件在远程排序、行内编辑、动态列等真实需求中的能力差异,并结合团队迁移成本与设计体系约束,给出基于数据量和编辑行为的选型决策模型。由原理到实践,帮助开发者在管理型与工具型项目中快速匹配最合适的表格技术栈,规避滚动卡顿、表头错位及样式

weixin_31881651的博客 148

vue获取后端数据并渲染

Axios是一个流行的JavaScript库,用于在浏览器和node.js中发起HTTP请求。在utiles文件夹里配置。

m0_58900588的博客 2393

别再只会用a-table了!盘点Ant Design Vue表格组件那些鲜为人知的实用配置(附代码片段)

本文深入探讨了Ant Design Vue表格组件(a-table)的进阶配置,包括虚拟滚动优化、动态列配置、Composition API集成等实用技巧,帮助开发者突破万级数据渲染瓶颈并提升开发效率。通过代码示例和性能对比,展示了如何在中后台系统中高效使用这些鲜为人知的功能。

weixin_30753873的博客 344

Vue原生Grid组件:从数据管道到固定表头的生产级实现

表格组件是前端数据可视化的核心载体,其本质是将原始数据流经过滤、排序、分页、渲染四层处理后转化为可控视图。Vue.js凭借响应式系统与Composition API,为构建高性能Grid Component提供了底层支撑。本文聚焦纯Vue原生实现,深入解析Pagination分页策略如何避免computed切片引发的无效重渲染,Fixed Header如何通过getBoundingClientRect+RAF实现像素级对齐与跨浏览器兼容,同时兼顾列宽拖拽精度、滚动性能优化(120fps)、无障碍语义化等工程

weixin_33889245的博客 351

SpringBoot+Vue3博客后台集成Ant Design Vue实战与避坑指南

Vue3作为现代前端框架,配合SpringBoot构建前后端分离项目已是中小型内容管理系统的常见方案。UI组件库是提升后台开发效率的关键,Ant Design Vue基于Ant Design设计规范,提供表格、表单、弹窗、上传等高频组件,能快速搭建信息密集的后台界面。在博客后台场景中,通过全量或按需引入、布局组件与路由联动、Table分页请求、表单校验、图片上传等实践,可显著减少重复造轮子。同时注意版本选择、组件样式、命令式调用等细节,避免常见坑点。本文以博客后台为例,分享SpringBoot+Vue3集成

weixin_33800463的博客 292

Vue Grid组件深度设计:状态管理与性能优化实战

Grid 组件远不止是数据渲染的表格容器,而是融合响应式状态管理、DOM 行为控制与性能边界的前端核心业务单元。其本质是围绕 Pagination、Fixed Header、rowsPerPage 等关键能力构建可预测、可维护、可扩展的数据视图治理系统。通过分层架构(数据适配→状态管理→渲染计算→视图呈现),实现跨数据源兼容、暗色模式热插拔、离线编辑无缝集成等工程价值。适用于中后台系统中高交互、多维度、长生命周期的列表场景,尤其解决排序丢失、滚动卡顿、列宽错位、打印异常等 Vue 项目高频痛点。

weixin_34198881的博客 386

Vue 3进阶:通过7类开源项目掌握工程化与实战技能

在Vue 3开发中,掌握组合式API和响应式系统等核心概念是基础。理解其原理有助于构建可维护的应用架构。这些技术的价值在于提升开发效率和代码质量,广泛应用于企业后台、全栈应用和可视化项目等场景。本文聚焦Vue 3.4+生态,通过分析vue-vben-admin、Vitesse等代表性项目,深入探讨工程化思维和最佳实践,帮助开发者跨越从“学语法”到“做项目”的鸿沟,系统提升实战能力。

weixin_33857230的博客 442

Vue3 + Element Plus + Vite 后台管理系统开发实战

中后台管理系统的核心是数据驱动视图、组件化与工程化构建。Vue3 借助 Proxy 响应式和 Composition API 提升逻辑复用与类型推导,Vite 基于浏览器原生 ES Module 实现快速冷启动,Element Plus 提供表格、表单、弹窗等企业级组件。技术价值在于减少重复开发、统一交互样式并提升可维护性。在 CRM、运营后台、设备管理平台等数据密集型场景中,结合 Vue Router 动态路由、Pinia 状态管理和按钮级权限指令,可沉淀出可复用的后台脚手架。围绕 Vue3 + Elem

weixin_34127717的博客 281

半小时搭建SpringBoot+Vue3博客系统:主流技术栈实战指南

在Web开发领域,前后端分离架构已成为主流范式,其核心思想是将用户界面与业务逻辑解耦,通过API进行通信。这种架构模式提升了开发效率和系统可维护性,是现代企业级应用的标准实践。其技术价值在于实现了关注点分离,允许前后端团队并行开发,并支持技术栈的灵活选型。典型的应用场景包括内容管理系统、电商平台和中后台应用。本文聚焦于一个具体的实践案例——博客管理系统,它完整覆盖了从数据库设计、后端API开发到前端页面渲染的全流程。通过整合SpringBoot和Vue3这两大主流技术栈,项目演示了如何快速构建一个具备CRU

weixin_30580341的博客 413

Vue3零基础入门到实战:2026最新技术栈保姆级教程

前端开发的核心在于构建高效、可维护的用户界面,其原理基于组件化、响应式数据绑定和虚拟DOM等技术。这些技术为现代Web应用提供了模块化开发、状态管理和性能优化的工程价值,广泛应用于企业后台管理系统、移动端H5应用和内容型网站等场景。Vue3作为当前主流的前端框架,通过组合式API和响应式系统革新了开发体验。本教程聚焦于Vue3零基础入门到项目实战的完整学习路径,涵盖Vite、Pinia、Vue Router等核心生态工具,并提供配套源码与软件工具包,帮助初学者系统掌握从环境搭建到工程化部署的全流程。

weixin_30627341的博客 444

Vue Vben Admin深度封装实战:从配置驱动到源码调试的生存指南

在现代前端开发中,企业级中后台系统对开发效率和一致性有极高要求,配置驱动与声明式编程成为主流解决方案。其核心原理是通过抽象通用场景为可配置的JSON或函数参数,将复杂的UI交互和数据逻辑封装成黑盒,开发者只需关注业务配置而非底层实现。这种模式的技术价值在于能极大提升标准化项目的开发速度,并保障代码质量和团队协作规范。其典型应用场景包括各类后台管理系统、数据看板和运营平台。本文聚焦于Vue Vben Admin这一深度封装的代表框架,通过剖析其核心设计如`useTable`和`useForm`钩子,并结合**

weixin_34198762的博客 428

Vue 完整版系统知识文档

《Vue全栈开发实战手册》摘要 本手册系统整合Vue2/Vue3全栈知识体系,涵盖基础语法、组件开发、状态管理、工程化等核心内容,适合从入门到精通的完整学习路径。主要特点: 基础核心 详解MVVM架构和响应式原理(Vue2的Object.defineProperty vs Vue3的Proxy) 完整模板语法规则与16种内置指令解析 组件系统核心:通信机制(8种方案)、插槽、动态组件、递归组件 进阶实战 状态管理:Vuex/Pinia完整解决方案 路由开发:动态路由、权限控制、懒加载 工程化:Webpack

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 402

中科闻歌前端面试题及参考答案

call、apply、bind 无法修改箭头函数内部 this,就算传入参数,绑定 this 的参数会直接被忽略。

大模型大数据攻城狮的专栏 174

用Python+PyTorch实现DQN无人机避障:从环境搭建到实战训练(附完整代码)

本文详细介绍了如何使用Python和PyTorch框架,基于深度强化学习中的DQN算法,实现一个无人机自主避障系统。内容涵盖从自定义环境搭建、DQN智能体核心算法实现,到完整的训练流程与超参数调优,并提供了可视化演示与进阶优化方向,为开发者提供了从理论到实践的完整指南。

kubernetes8ctl的博客 640

2026面试预判及实际面试

本文摘要总结了多个前端开发岗位的面试问题和答案,涵盖Vue3、ECharts、数据可视化、JavaScript核心概念等内容。 Vue3高频问题 组合式API相比选项式API的优势在于逻辑内聚、更好的TS支持和复用性。 状态管理推荐Pinia,轻量且支持组合式API风格。 动态路由和权限控制通过router.addRoute和路由守卫实现。 响应式原理基于Proxy和Reflect,解决了Vue2的局限性。 ECharts与数据可视化 性能优化包括数据聚合、懒渲染和dataZoom区域缩放。

Mr.小灰狼_随笔 581

焦距与视差的关系及其对深度估计的影响

焦距在立体视觉中的作用至关重要,它直接影响视差的大小,从而影响深度估计的精度。焦距越长,视差差异越大,物体的深度估计就越精确。这一关系使得焦距长的相机在一些需要高精度深度估计的应用场景中更加优越。了解焦距与视差的关系,对于优化相机配置和提升深度估计精度具有重要意义。在实践中,选择合适的焦距对于获得精确的深度信息至关重要,特别是在自动驾驶、虚拟现实、三维重建等领域,精确的深度估计能够提供更好的用户体验和技术支持。

计算机科学与技术专业学生的成长之路 1673

vue中拿到接口,并获取数据,渲染到页面

首先index.html完成的是单页面展示,app.vue里面已经写了视图出口, 例如;先新建一个role.vue页面,写上相应的布局和内容,然后在路由中添加这个页面。 然后开始写渲染数据的方法 前提,封装好了获取数据的api接口,并在main,js中注册到了原型。 然后在 1,首先在api中获取接口, 2,在utils中封装http请求的get 和post方法,并注册到原型 import axios from "axios" // 添加一个请求拦截器,回调函数会在发出请求时执行 // conf

lyclyc_的博客 4万+

AWD线下攻防赛总结

在本地组策略编辑器里面,依次展开计算机配置—>管理模板—>Windows组件—>远程桌面服务—>远程桌面会话主机—>连接—>限制连接的数量。8.Web目录环境查找相关可疑文件:jpg/png/rar,属性、解压。进程线程:netstat / ps -aux/netstat -apt。4.查看/etc/init.d/rc.local中启动服务有无异常。1.不使用默认口令,修改成复杂的,并确保和web环境连接。5.使用脚本开启进程监控、目录监控、流量监控。文件操作监控.exe/御剑文件监控.exe。

XuJL89的博客 630

Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇

Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇 文章目录Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇前言一、数据库的安装前准备,前提是没有安装过!!!二、仅安装数据库软件(数据库运行环境)三、添加数据库实例四、设置监听程序,让数据库可以通过网络访问五、为目标数据库设置网名总结 前言 如果需要安装包:联系我看到会给你链接,因为现在官网已经不提供10g,11g的安装包了,在网盘保存望悉知(回复不会很及时,下班看到会回复敬请谅解)。 提示:以下

zhx__的博客 5631

Vue数据渲染技巧:从三种方式看后端数据的灵活处理

【代码】Vue根据后端返回结果转换成不同的展示效果的三种方式。

七一 1633

基于STM32的智能快递柜设计(全部资料)

本文设计了一种基于STM32F407ZGT6的智能快递柜系统,通过模块化硬件设计和软件算法优化,实现了24小时无人值守、温湿度智能调控、远程监控等功能。系统集成OLED显示、GSM通信、舵机控制、超声波检测等模块,存取响应时间≤3秒,识别准确率达99.2%,较传统模式效率提升60%。测试表明系统运行稳定,用户满意度达92%,具有成本低、安全性高、可扩展性强等特点,为智慧物流末端配送提供了创新解决方案。未来可引入AI算法、太阳能供电等功能进一步优化系统性能。

3254968421的博客 590
上一篇: vue:关于异步请求导致页面不渲染问题的解决
下一篇: 使用ant design vue中a-table实现自定义列拖拽 以及解决列拖拽时表格大小跟着变化的问题
鸭不是鸭
博客等级 码龄5年 10粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值