保姆级教程:Ant Design Vue中 a-table 嵌套子表格

这篇具有很好参考价值的文章主要介绍了保姆级教程:Ant Design Vue中 a-table 嵌套子表格。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前端为Ant Design Vue 版本为1.6.2,使用的是vue2

Ant Design Vue中 a-table 嵌套子表格,说的可能稍微墨迹了点,不过重点内容都说的比较详细,利于新人理解,高手可以自取完整代码

完成样式及完整代码展示

下图为官网图,会在每行最前面多一个加号,点击后会展开,看到子表格的数据
a-table,笔记,前端技术,vue.js,javascript,前端

<template>
  <div>
    <a-card>
      <a-table :columns="columns" :data-source="datasource"  :bordered="true"  :expandedRowKeys="expandedRowKeys" 
        @expand="getInnerData" :pagination="pagination">
        <a-table slot="expandedRowRender" slot-scope="text" :columns="innerColumns" :data-source="inndata"
          :pagination="false"></a-table>
        <span slot="operation" slot-scope="text, record">
          <a-button type="primary" icon="unordered-list" @click="getData(record)">
            详情
          </a-button>
        </span>
      </a-table>
    </a-card>
  </div>
</template>
<script>
import { axios } from '@/utils/request'

const columns = [
  {
    title: '序号',
    dataIndex: 'id',
    key: 'id',
  },
 。。。。。中间省略
  {
    title: '操作',
    key: 'operation',
    width: '80px',
    scopedSlots: { customRender: 'operation' },
  },
];

const innerColumns = [
   {
    title: '子表单列',
    dataIndex: 'XXX',
    key: 'XXX',
  },
];

const inndata = [];

export default {
  data() {
    return {
      datasource: [],
      columns,
      innerColumns,
      inndata,
      expandedRowKeys:[],
      pagination: {
        //分页
        showSizeChanger: true, //是否分页
        curPageSizeIndex: 0,
        pageSize: 10, //一页显示多少条
        // total: 1, //总条数
        current: 1, //当前显示页面
        pageSizeOptions: ['10', '20', '30'],
        showTotal: (total) => `共计 ${total}`, //显示总数
        onShowSizeChange: (current, pagesize) => {
          this.pagination.current = current
          this.pagination.pageSize = pagesize
          this.options.offset = (current - 1) * pagesize
          this.options.limit = pagesize
          this.refreshData()
        },
        onChange: (current, pageSize) => {
          this.pagination.current = current
          this.options.offset = (current - 1) * pageSize
          this.options.limit = pageSize
          this.refreshData()
        },
      },
    }
  },

  mounted() {
    this.refreshData()
  },
  methods: {
    refreshData() {
      axios({
        url: 'url',
        method: 'post',
      }).then((res) => {
        if (res.errCode > 0) {
          this.$notification.error({
            message: '错误信息',
            description: res.errMsg,
          })
          return
        }
        console.log(res, '数据')
        this.datasource = res
      })
    },
    
    getInnerData(expanded, record) {
      this.expandedRowKeys=[]
      if (expanded) { 
        var b = ''
        b=(record.id-1).toString()
        this.expandedRowKeys.push(Number(b.slice(-1)))
        this.inndata = [];
        this.inndata.push(this.datasource[record.id - 1])
      }
    },

    getData(record) {
      console.log(record);
    },

  },
}
</script>
<style scoped>
</style>

子表格嵌套

子格嵌套从代码层简单理解就是一个<a-table></a-table>中套了一个<a-table></a-table>,即<a-table><a-table></a-table></a-table>,当然,这只是一个简单理解,并不是这样写,要在其中添加一些东西。
抛开一些配置项,解释下:

<template>
  <div>
    <a-card>
    // 这里开始是父表格组件,columns -> 父级列名,datasource -> 父级表中的数据, @expand="getInnerData" -> 点开子表单的操作函数,pagination -> 分页的设置
      <a-table :columns="columns" :data-source="datasource"  
        @expand="getInnerData" :pagination="pagination">
        // 这里开始是子表格组件,slot="expandedRowRender" 重点,必须有,innerColumns-> 子级列名,inndata-> 子级表中的数据,
        <a-table slot="expandedRowRender" slot-scope="text" :columns="innerColumns" :data-source="inndata"
          :pagination="false"></a-table>// 这里是子表格组件结尾
          // 这里是父表格span,不用的可以删掉
        <span slot="operation" slot-scope="text, record">
          <a-button type="primary" icon="unordered-list" @click="getData(record)">
            详情
          </a-button>
        </span>
      </a-table>// 这里是父表格组件结尾
    </a-card>
  </div>
</template>
<script>
// 数据请求axios 
import { axios } from '@/utils/request'

// 设置父级列名
const columns = [
  {
    title: '序号',
    dataIndex: 'id',
    key: 'id',
  },
 。。。。。中间省略
  {
    title: '操作',
    key: 'operation',
    width: '80px',
    scopedSlots: { customRender: 'operation' },
  },
];

// 设置子级列名
const innerColumns = [
   {
    title: '子表单列',
    dataIndex: 'XXX',
    key: 'XXX',
  },
];

// 设置子级数据,写下面data里也行
const inndata = [];

export default {
  data() {
    return {
      datasource: [],
      columns,
      innerColumns,
      inndata,
      pagination: {
        //分页
        showSizeChanger: true, //是否分页
        curPageSizeIndex: 0,
        pageSize: 10, //一页显示多少条
        // total: 1, //总条数
        current: 1, //当前显示页面
        pageSizeOptions: ['10', '20', '30'],
        showTotal: (total) => `共计 ${total}`, //显示总数
        onShowSizeChange: (current, pagesize) => {
          this.pagination.current = current
          this.pagination.pageSize = pagesize
          this.options.offset = (current - 1) * pagesize
          this.options.limit = pagesize
          this.refreshData()
        },
        onChange: (current, pageSize) => {
          this.pagination.current = current
          this.options.offset = (current - 1) * pageSize
          this.options.limit = pageSize
          this.refreshData()
        },
      },
    }
  },

  mounted() {
  // 进入页面直接运行的函数
    this.refreshData()
  },
  methods: {
  // 异步请求获取数据
    refreshData() {
      axios({
        url: 'url',
        method: 'post',
      }).then((res) => {
        if (res.errCode > 0) {
          this.$notification.error({
            message: '错误信息',
            description: res.errMsg,
          })
          return
        }
        console.log(res, '数据')
        // 将数据赋值给父级表格
        this.datasource = res
      })
    },
    
      // 点开子级表格(就是点击那个加号)触发的函数
    getInnerData(expanded, record) {
    // 判断是否点开
      if (expanded) { 
      // 点开后执行。。。
      // 先将子级表格数据清空,否则之前点开别的行的数据也会在里面
        this.inndata = [];
        // 再将父级点击的那一行的数据(record)给子级数据存进去,具体情况根据自己需求更改
        this.inndata.push(record)
      }
    },
// 点击父级表格表格span,也就是那个“详情”按钮触发的函数
    getData(record) {
      console.log(record);
    },

  },
}
</script>
<style scoped>
</style>

通过上述操作会发现能够实现基本的子表格嵌套,但是会发现点开一个子表单后,再点一个,两个都会打开,但是里面的子表格数据是相同的,这就是个很大的问题,为了解决这个问题,请看下面,这个在官网没直接写出来,API里有相关的参数,现在告诉你应该怎样操作

只打开一个嵌套表格

为了防止点开多个子表格内容相同,再结合我自己的使用场景,我只需要展开一个子表格就行,也就是说点开新的子表格后,原来的子表格自动关闭
下面把需要改动的代码片段给你们:
1. 父级中的修改内容

   // 添加  :expandedRowKeys="expandedRowKeys"   目的是使expandedRowKeys只有最新点开子表单的key
	<a-table :columns="columns" :data-source="datasource"  :bordered="true"  :expandedRowKeys="expandedRowKeys" 
        @expand="getInnerData" :pagination="pagination">
        <a-table slot="expandedRowRender" slot-scope="text" :columns="innerColumns" :data-source="inndata"
          :pagination="false"></a-table>
        <span slot="operation" slot-scope="text, record">
          <a-button type="primary" icon="unordered-list" @click="getData(record)">
            详情
          </a-button>
        </span>
     </a-table>

2. 在data里加上空的 expandedRowKeys

export default {
  data() {
    return {
      datasource: [],
      columns,
      innerColumns,
      inndata,
      // 添加空的expandedRowKeys
      expandedRowKeys:[],
      。。。。。。

3. 修改getInnerData函数文章来源地址https://www.toymoban.com/news/detail-791235.html

 getInnerData(expanded, record) {
    // 先将expandedRowKeys数据清空
      this.expandedRowKeys=[]
      if (expanded) { 
        //  将父级的第几条数据传到expandedRowKeys里,我这用的是数据表里的id处理的,我的id是从1开始
        //  我这是一页十条数据,要放入0-9,第一条是0,第十条是9,一定要是数字格式
        //  再一个,注意下,假设使用的是数据中的第45条,record.id=45
        //  但是传入 expandedRowKeys 只能是0-9,且是数字格式,那么应该将数字4传到expandedRowKeys中
        //  因为record.id=45这条数据,在表格中的第五行,应该是4
        //  所以有了下面的record.id-1,再转成字符串格式,取最后一位,再转成数字
        //  也有人用key,id能够获取到,不过我没弄成功,就这样吧,实现功能就行
        var b=(record.id-1).toString()
        this.expandedRowKeys.push(Number(b.slice(-1)))
        
        //  下面两行说过,我就把注释直接粘过来了
        // 先将子级表格数据清空,否则之前点开别的行的数据也会在里面
        this.inndata = [];
        // 再将父级点击的那一行的数据(record)给子级数据存进去,具体情况根据自己需求更改
        this.inndata.push(record)
      }
    },

到了这里,关于保姆级教程:Ant Design Vue中 a-table 嵌套子表格的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • ant-design-vue的table表格行合并和列合并

    场景说明: 1、列合并:需要在表格最后一列进行合并,如图: 思路:相当于是第二列的最后一栏(colSpan )占比5列,第2列后面的4列最后一行(colSpan )占比0。 代码示例 行合并需求如图:将指定列的多行合并成一行 思路:和合并列差不多;第一列的第一行和第二行要合并

    2024年02月16日
    浏览(33)
  • Ant Design Vue 中将 Table 表格中的数字类型转换为文字的方法详解

    在使用 Ant Design Vue 开发时,有时需要将 Table 表格中的数字类型字段转换为对应的文字表示,以提供更直观的数据展示。本文将详细介绍在 Ant Design Vue 中将 Table 表格中的数字类型转换为文字的方法,帮助您灵活地处理数据展示需求。 在实际的应用中,我们经常会遇到需要将

    2024年02月11日
    浏览(35)
  • vue3 组合式 ant.design组件Table嵌套表格,从后端获取数据并动态渲染

    在根据官方文档使用ant.design中的嵌套表格时,发现官方文档很多地方都不够详细。在过程中踩了不少坑,例如: 子表如何获取父表的数据? 如何获取子表的行索引? 如何让子表的数据源来自父表该行的数据? 总之,最后还是磕磕绊绊做完了功能,于是第一时间把代码整理

    2024年02月15日
    浏览(28)
  • Ant Design Vue 修改表格头部样式

    在网上搜了好多修改表格头部样式的,最后自己摸索出来,分享给大家,最后附上完整代码。 首先用到的是 customHeaderRow 这个API,类型是一个函数 此图是 console.log(conlumn); 打印出来的 可以看到每一列都有一个className

    2024年02月11日
    浏览(33)
  • Ant Design Vue的table组件高度自适应问题

    今天在编写公司项目的时候碰到ant design vue的table组件高度没办法自适应的问题,会出现如下页面情况。  最终尝试的解决方案只能通过监听浏览器窗口变化实现自适应 (1)给表格的srcoll定义一个动态接收参数,方便后面数据增加动态改变滚动高度。  (2)vue3项目中就直接

    2024年02月16日
    浏览(38)
  • Ant Design Vue实现表格双击编辑、添加新行、文字提示

    早上刚上班,产品就朝我工位走了过来,一看大事不好,肯定又是来提需求的! 产品:做一个表格,要实现双击编辑的功能 我:做不了 产品:老板提的 我:好的,可以做 老板提的不能做也滴做😂 申明:项目基于Vue+Ant Design实现 想要实现双击编辑单元格,先开发一个简单的

    2024年02月11日
    浏览(36)
  • vue3 + Ant Design 实现双表头表格(横向表头+纵向表头)

     一、要实现的效果( 纵向固定表头的表格,横向表头数量动态化 ) 二、这是后台返回的数据格式(以企业为数组,每个企业里有个站点数组pointFactors)   三、代码实现步骤   (1)定义纵向固定表头 (2)动态生成横向表头( 从接口获取数据 )   (3)循环原始数据,生

    2024年02月04日
    浏览(38)
  • [ant-design-vue] table组件列宽拖拽功能

    原有的样式文件没有使用的必要,个人添加的部分样式内容就符合需求了 vue3.x对应的ant-design-vue中的table组件本身支持列宽的拖动了,不需求额外的包的支持,根据Api说明设置resizeColumn即可

    2024年01月23日
    浏览(42)
  • ant vue table表格数据动态合并

    antd 表格动态行合并 合并效果 步骤方法 1.在computed节点下动态计算每次要合并的行数 2.在methods节点下定义合并单元格的方法 3.如果是一次性获取所有数据进行分页的话,计算columns的时候需要进行修改一下 参考文章:ant design vue 动态表格合并 合并效果 如果我们想要实现名称

    2024年02月10日
    浏览(39)
  • 【ant design vue的table设置scroll后出现滚动条的隐藏处理】

    当table列表内容需要y轴方向滚动时,我们添加并设置了scroll值,例如下: 效果如下: 此时,列表的表头及列表的底部(:scroll中不设置x,底部的滚动条也不会出现)也出现了滚动条,表格看起来不简洁,可以在css添加以下样式: 效果如下:

    2024年02月16日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包