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

这篇具有很好参考价值的文章主要介绍了vue3 组合式 ant.design组件Table嵌套表格,从后端获取数据并动态渲染。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

如何获取子表的行索引?

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

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

首先,后端返回的数据是json格式。文章来源地址https://www.toymoban.com/news/detail-616376.html

后端返回数据格式如下:

{
    "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 组合式 ant.design组件Table嵌套表格,从后端获取数据并动态渲染的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3组合式API

    目录 composition API vs options API 体验 composition API setup 函数 reactive 函数 ref 函数 script setup 语法 计算属性 computed 函数 监听器 watch 函数 生命周期 模板中 ref 的使用 组件通讯 - 父传子 组件通讯 - 子传父 依赖注入 - provide 和 inject 保持响应式 - toRefs 函数 vue2 采用的就是 options API (

    2024年02月07日
    浏览(66)
  • vue3组合式API介绍

    根据官方的说法,vue3.0的变化包括性能上的改进、更小的 bundle 体积、对 TypeScript 更好的支持、用于处理大规模用例的全新 API,全新的api指的就是本文主要要说的组合式api。 在 vue3 版本之前,我们复用组件(或者提取和重用多个组件之间的逻辑),通常有以下几种方式: M

    2023年04月22日
    浏览(63)
  • Vue3 组合式函数,实现minxins

    截至目前,组合式函数应该是在VUE 3应用程序中组织业务逻辑最佳的方法。它让我们可以把一些小块的通用逻辑进行抽离、复用,使我们的代码更易于编写、阅读和维护。 根据官方文档说明,在 Vue 应用的概念中, “组合式函数”是一个利用 Vue 组合式 API 来封装和复用有状态

    2024年02月08日
    浏览(41)
  • 快速入门vue3组合式API

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 使用create-vue创建项目 熟悉项目目录和关键文件  组合式API  setup选项 setup选项的写法和执行时机 script setup 语法糖 reactive和ref函数 reactive() ref() computed watch 侦听单个数据

    2024年02月12日
    浏览(50)
  • 【Vue3】如何创建Vue3项目及组合式API

    文章目录 前言 一、如何创建vue3项目? ①使用 vue-cli 创建  ②使用可视化ui创建  ③npm init vite-app   ④npm init vue@latest 二、 API 风格 2.1 选项式 API (Options API) 2.2 组合式 API (Composition API) 总结 例如:随着前端领域的不断发展,vue3学习这门技术也越来越重要,很多人都开启了学习

    2024年02月03日
    浏览(65)
  • 带你了解vue3组合式api基本写法

    本文的目的,是为了让已经有 Vue2 开发经验的 人 ,快速掌握 Vue3 的写法。 因此, 本篇假定你已经掌握 Vue 的核心内容 ,只为你介绍编写 Vue3 代码,需要了解的内容。 一、Vue3 里 script 的三种写法 首先,Vue3 新增了一个叫做组合式 api 的东西,英文名叫 Composition API。因此 Vu

    2024年02月01日
    浏览(81)
  • vue3组合式写法在方法中出发点击事件

    问: 用vue3组合式写法,如何在一个方法中调用a标签的点击事件 回答: 在Vue 3的组合式API中,可以通过ref来获取DOM元素的引用,然后使用$el属性访问DOM元素并触发其点击事件。下面是示例代码: 在上述代码中,首先通过ref创建了一个名为linkRef的引用变量,并将其初始化为

    2024年02月15日
    浏览(50)
  • vue3:7、组合式API-watch

     

    2024年02月09日
    浏览(43)
  • Vue3的组合式API中如何使用provide/inject?

    听说 Vue 3 加入了超多酷炫的新功能,比如组合式 API 等等。今天我们就来聊聊 Vue 3 中的组合式 API,并且如何使用 provide/inject 来搞定它! 首先,我们来了解一下组合式 API 是什么。其实,组合式 API 就是一个用来构建和组合函数的工具,它能让我们的代码更加简洁、可读性更

    2024年02月11日
    浏览(44)
  • vue3 组合式api中 ref 和$parent 的使用

    ref 的使用 vue3中, 在 组件中添加一个 component ref=“xxx” ,就可以在父组件中得到 子组件的 dom 对象, 以及 虚拟的 dom 对象, 有了虚拟 dom, 我们就可以在父组件中控制子组件的显示了 ref 的使用方法 vue3中ref 的特点 以上如果在vue2中,就可以使用 子组件的对象来改变子组件的

    2024年02月10日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包