Vue + ant design 实现嵌套子表格

Table - 嵌套子表格

一、效果展示

功能1:添加主表格一行
功能2:添加某个子表格一行
功能3:子表格数据的异步加载

在这里插入图片描述
在这里插入图片描述

二、代码实现

<template>
  <div>
    <a-button @click="add" type="primary" size="small" style="margin:20px">添加主表格数据</a-button>
    <a-table
      :columns="columns"
      :data-source="data"
      class="components-table-demo-nested"
      @expand="getInnerData"
      @expandedRowsChange="expandedRowsChange"
      style="margin:20px"
    >
      <a slot="operation" slot-scope="row" @click="addInnderData(row)">添加子表格数据</a>
      <a-table
        slot="expandedRowRender"
        slot-scope="inner"
        :columns="innerColumns"
        :data-source="inner.innerData"
        :pagination="false"
      >
        <span slot="operation" slot-scope="text" class="table-operation">
          <a-dropdown>
            <a-menu slot="overlay">
              <a-menu-item>Action 1</a-menu-item>
              <a-menu-item>Action 2</a-menu-item>
            </a-menu>
            <a>
              More
              <a-icon type="down" />
            </a>
          </a-dropdown>
        </span>
      </a-table>
    </a-table>
  </div>
</template>
<script>


const columns = [
  { title: 'Name', dataIndex: 'name', key: 'name' },
  { title: 'Sex', dataIndex: 'sex', key: 'sex' },
  { title: 'Age', dataIndex: 'age', key: 'age' },
  { title: 'Hobby', dataIndex: 'hobby', key: 'hobby' },
  { title: 'Action', key: 'operation', scopedSlots: { customRender: 'operation' } },
];

const innerColumns = [
  { title: 'Name', dataIndex: 'name', key: 'name' },
  { title: 'Sex', dataIndex: 'sex', key: 'sex' },
  { title: 'Age', dataIndex: 'age', key: 'age' },
  { title: 'Hobby', dataIndex: 'hobby', key: 'hobby' },
  {
    title: 'Action',
    dataIndex: 'operation',
    key: 'operation',
    scopedSlots: { customRender: 'operation' },
  },
];

export default {
  created() {
    this.init() // 获取主表格数据
  },
  data() {
    return {
      data: [],
      columns,
      innerColumns,
      expandedRowKeys: []
    };
  },
  methods: {
    /*
    * 功能:表格展开行的集合
    * 参数:expandedRowKeys:展开行的key形成的数组
    */
    expandedRowsChange(expandedRowKeys) {
      this.expandedRowKeys = expandedRowKeys
    },
    /*
   * 功能:加载主表格数据
   * 说明:此处采用键值对的形式,是为了避免全部子表格数据相同
   */
    init() {
      this.data.push({
        key: 0,
        name: '小红',
        sex: '女',
        age: '18',
        hobby: '唱歌',
        innerData: []
      }, {
        key: 1,
        name: '小明',
        sex: '男',
        age: '25',
        hobby: '打篮球',
        innerData: []
      }, {
        key: 2,
        name: '小兰',
        sex: '女',
        age: '15',
        hobby: '看书',
        innerData: []
      })
      console.log(this.data);
      console.log('主表格加载完');
    },
    /*
    * 功能:点击某行加号,加载子表格数据
    * 参数:expanded:是否展开 
    * 参数:record:点击行的数据
    */
    getInnerData(expanded, record) {
      if (expanded) { // 当展开子表格时,才会加载子表格数据
        if (record.key === 0) {
          this.data[0].innerData = [] // 因为我每次用的相同假数据,所以此处需要先清空。
          this.data[0].innerData.push({
            key: 11,
            name: '小白',
            sex: '女',
            age: '8',
            hobby: '看电影',
          }, {
            key: 12,
            name: '小黑',
            sex: '男',
            age: '36',
            hobby: '跑步',
          })
        } else if (record.key === 1) {
          this.data[1].innerData = [] // 因为我每次用的相同假数据,所以此处需要先清空。
          this.data[1].innerData.push({
            key: 21,
            name: '小刚',
            sex: '男',
            age: '28',
            hobby: '运动',
          }, {
            key: 22,
            name: '小白',
            sex: '女',
            age: '8',
            hobby: '看电影',
          })
        } else {
          this.data[2].innerData = [] // 因为我每次用的相同假数据,所以此处需要先清空。
          this.data[2].innerData.push({
            key: 31,
            name: '花花',
            sex: '男',
            age: '48',
            hobby: '收拾',
          }, {
            key: 32,
            name: '哦哦',
            sex: '男',
            age: '12',
            hobby: '吃饭',
          })
        }
      }
      console.log(this.data);
      console.log('加载子表格');
    },
    /*
    * 功能:添加主表格一行
    */
    add() {
      let i = this.data.length // 保证key唯一
      this.data.push({
        key: i,
        name: `${ i + 1 }`,
        sex: `${ i + 1 }`,
        age: '12',
        hobby: '吃饭',
        innerData: []
      })
    },
    /*
    * 功能:添加子表格一行
    * 参数:row:点击行的信息
    */
    addInnderData(row) {
      // 只有当这一行展开时,点击添加子表格才会有数据。
      if (this.expandedRowKeys.includes(row.key)) {
        let i = row.key * 10 + row.innerData.length + 1
        this.data.forEach(item => {
          if (item.key === row.key) {
            item.innerData.push({
              key: i,
              name: '哦哦',
              sex: '男',
              age: '12',
              hobby: '吃饭',
            })
          }
        })
      }
    }
  }
};
</script>

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
Vue Ant Design是一个基于Vue.js和Ant Design的UI组件库,它提供了许多易于使用和高度可定制的组件,其中包括数据表格。数据表格在数据可视化、数据交互、数据处理等方面都起到了重要作用,而在实际使用中,我们有时需要对表格进行拖拽操作来调整列的顺序或列宽度等。下面将介绍如何在Vue Ant Design实现表格拖拽功能。 1. 首先,在引入Vue Ant Design的基础上,需要安装 vue-draggable-resizable 插件,该插件提供了拖拽和缩放组件的功能。 2. 创建一个数据表格,并绑定表头数据和表格数据。在表头中添加拖拽事件监听器,在该监听器中调用拖拽组件的相关方法,以实现拖拽操作。例如,对于列宽度的拖拽操作,需要添加拖拽事件监听器到表头中的每一列上,然后在监听器中获取拖拽事件的位置信息和表格的宽度信息,计算得到新的列宽度,最后更新表格列的宽度属性即可。对于列顺序的拖拽操作,可以在表头的拖拽事件监听器中同样调用拖拽组件的相关方法,以实现列顺序的交换。 3. 在拖拽事件监听器中,还可以使用拖拽组件的其他方法,例如限制拖拽的范围、设置拖拽边界、自定义拖拽样式等,以满足具体的需求。 总之,Vue Ant Design提供了丰富的组件和插件,使得实现表格拖拽功能变得非常简单和高效。开发者只需要根据具体的需求,灵活运用相关的组件和方法,即可实现各种表格拖拽操作,并提升用户体验和数据交互效果。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值