vxe-table 实现嵌套子表格

一、功能说明

1.图1:表格主界面

在这里插入图片描述

说明:
1)新增:点击触发函数 addParent 添加父表格一行,并激活这行,实现新增后编辑行信息。激活效果见图2。
2)导出:点击触发函数 exportData,在控制台打印保存表格数据的变量 parentData
3)删除:点击触发函数 deleteParent,删除当前行。
4)新增:点击触发函数 addChild,打开弹窗,在弹窗内填写数据。点击提交触发函数 submitEvent,在当前行下的子表格新增一行。弹窗效果见图3。

2.图2:新增父表格

在这里插入图片描述

说明:红框就是激活状态。

3.图3:新增子表格

在这里插入图片描述

4.图4:子表格

在这里插入图片描述

说明:
1)删除:点击触发函数 deleteChild,删除子表格当前一行。

二、代码实现

<template>
  <div class="box">
  
    <!-- 新增父表格行 -->
    <vxe-button content="新增" @click="addParent" style="margin:0 5px 5px 0"></vxe-button>
    <vxe-button content="导出" @click="exportData" style="margin-bottom:5px"></vxe-button>

    <vxe-table
      resizable
      border
      ref="xTable"
      :data="parentData"
      :edit-config="{trigger: 'click', mode: 'row'}"
      row-id="id"
    >
      <!-- 子表格 -->
      <vxe-column type="expand" width="80">
        <template #content="{ row:parentRow,rowIndex:parentIndex }">
          <vxe-table :data="parentRow.info">
            <vxe-column field="name" title="姓名"></vxe-column>
            <vxe-column field="age" title="年龄"></vxe-column>
            <vxe-column field="date" title="出生日期"></vxe-column>
            <vxe-column title="操作">
              <template #default="{ row ,rowIndex}">
                <vxe-button
                  status="primary"
                  type="text"
                  round
                  @click="deleteChild(row,rowIndex,parentIndex)"
                >删除</vxe-button>
              </template>
            </vxe-column>
          </vxe-table>
        </template>
      </vxe-column>
      
      <!-- 父表格列 -->
      <vxe-column field="name" title="姓名" :edit-render="{}">
        <template #edit="{ row }">
          <vxe-input v-model="row.name" type="text"></vxe-input>
        </template>
      </vxe-column>
      <vxe-column field="phone" title="电话" :edit-render="{}">
        <template #edit="{ row }">
          <vxe-input v-model="row.phone" type="number"></vxe-input>
        </template>
      </vxe-column>
      <vxe-column field="address" title="地址" :edit-render="{}">
        <template #edit="{ row }">
          <vxe-input v-model="row.address" type="text"></vxe-input>
        </template>
      </vxe-column>
      <vxe-column title="操作">
        <template #default="{ row,rowIndex }">
          <vxe-button
            type="text"
            status="primary"
            @click="deleteParent(row,rowIndex)"
            style="margin:0 5px"
          >删除</vxe-button>
          <vxe-button type="text" status="primary" @click="addChild(row,rowIndex)">新增</vxe-button>
        </template>
      </vxe-column>
    </vxe-table>

    <!-- 新增子表格弹窗 -->
    <vxe-modal
      v-model="showEdit"
      title="新增"
      width="800"
      min-width="600"
      min-height="300"
      :loading="submitLoading"
      resize
      destroy-on-close
    >
      <template #default>
        <vxe-form :data="formData" title-align="right" title-width="100" @submit="submitEvent">
          <vxe-form-item field="name" title="Name" :span="12" :item-render="{}">
            <template #default="{ data }">
              <vxe-input v-model="data.name" placeholder="请输入名称"></vxe-input>
            </template>
          </vxe-form-item>
          <vxe-form-item field="age" title="Age" :span="12" :item-render="{}">
            <template #default="{ data }">
              <vxe-input v-model="data.age" type="number" placeholder="请输入年龄"></vxe-input>
            </template>
          </vxe-form-item>
          <vxe-form-item field="date" title="Date" :span="12" :item-render="{}">
            <template #default="{ data }">
              <vxe-input v-model="data.date" type="date" placeholder="请选择日期" transfer></vxe-input>
            </template>
          </vxe-form-item>
          <vxe-form-item align="center" title-align="left" :span="24">
            <template #default>
              <vxe-button type="submit">提交</vxe-button>
              <vxe-button type="reset">重置</vxe-button>
            </template>
          </vxe-form-item>
        </vxe-form>
      </template>
    </vxe-modal>
  </div>
</template>

<script>
import axios from 'axios'
import VXETable from 'vxe-table'

export default {
  data() {
    return {
      parentData: [], // 父表格
      showEdit: false, // 创建子表格对话框
      submitLoading: false, // 对话框提交加载
      formData: { // 对话框表单数据
        name: null,
        age: null,
        date: null,
      },
      addChildRowIndex: null // 触发对话框的行索引
    }
  },
  created() {
    this.getParentData()
  },
  methods: {
    async getParentData() {
      const res = await axios.get('http://127.0.0.1:4523/m1/1552165-0-default/user/list')
      this.parentData = res.data.list
    },
    addParent() {
      let obj = {
        name: null,
        address: null,
        phone: null,
        info: {
          name: null,
          age: null,
          date: null,
        }
      }
      this.parentData.push(obj)
      const $table = this.$refs.xTable
      $table.setActiveRow(obj)
      VXETable.modal.message({ content: '新增成功', status: 'success' })
    },
    exportData() {
      console.log(this.parentData);
    },
    deleteParent(row, rowIndex) {
      this.parentData.splice(rowIndex, 1)
      VXETable.modal.message({ content: '删除成功', status: 'success' })
    },
    addChild(row, rowIndex) {
      this.addChildRowIndex = rowIndex
      this.showEdit = true
    },
    submitEvent() {
      this.submitLoading = true
      setTimeout(() => {
        this.submitLoading = false
        this.showEdit = false
        this.parentData[this.addChildRowIndex].info.push(this.formData)
        this.formData = {
          name: null,
          age: null,
          date: null,
        }
        this.addChildRowIndex = null
        VXETable.modal.message({ content: '新增成功', status: 'success' })
      }, 500)
    },
    deleteChild(row, rowIndex, parentIndex) {
      this.parentData[parentIndex].info.splice(rowIndex, 1)
      VXETable.modal.message({ content: '删除成功', status: 'success' })
    }
  }
}
</script>

<style>
.box {
  padding: 50px;
}
</style>
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: j-vxe-table是一个基于Vue.js构建的表格组件。它支持嵌套表格,以一种清晰而有条理的方式呈现信息。 嵌套表格是指在主表格,某一行的数据可以展开显示其表格,来呈现该行数据的更详细信息。j-vxe-table实现表格的方式是通过在主表格的某一列嵌套另一个表格组件,通过设置相关属性,将该表格组件的数据与主表格该行数据相关联,从而在表格显示其详细信息。 使用j-vxe-table嵌套表格需要注意以下几点: 1. 在主表格定义哪一列需要展开表格,并在该列对应的项设置相应的属性,以告知j-vxe-table要显示表格。 2. 在进行表格的自定义时,需要使用j-vxe-table内置的组件和相关样式类,从而实现表格的样式和结构。 3. 表格和主表格数据的关联和传递需要使用Vue.js的自定义指令和事件来实现。 4. 可以通过配置j-vxe-table的属性来限制表格的最大展示层数,从而避免嵌套表格过度而导致页面混乱。 综上所述,j-vxe-table嵌套表格是一种非常实用的数据展示方式,在需要呈现大量复杂数据时,可以极大地提升页面的可读性和易用性。但需要注意,在使用过程,需要对j-vxe-table的属性和使用方法有一定的理解和掌握,才能发挥出其最大的效用。 ### 回答2: j-vxe-table是一款基于Vue.js开发的表格组件库。它支持各种常见的表格功能,如分页、排序、过滤、编辑、导出等,还可以轻松实现多级表头、合并单元格和树形表格等高级功能,非常方便实用。 对于嵌套表格的需求,j-vxe-table同样可以轻松胜任。具体实现方法如下: 1. 首先,我们需要在父表格的列模板添加一个slot,用于显示表格。例如: ``` <template> <div> <vxe-table :data="tableData"> <vxe-table-column type="selection"></vxe-table-column> <vxe-table-column field="name" title="姓名"></vxe-table-column> <vxe-table-column field="age" title="年龄"></vxe-table-column> <!-- 添加表格的列 --> <vxe-table-column label="详情"> <template #default="{row}"> <vxe-table :data="row.children"> <vxe-table-column field="address" title="地址"></vxe-table-column> <vxe-table-column field="phone" title="电话"></vxe-table-column> </vxe-table> </template> </vxe-table-column> </vxe-table> </div> </template> ``` 在这个例,我们添加了一个名为“详情”的列,它的模板嵌套了一个表格表格的数据通过父表格一行的“children”属性来获取。 2. 接下来,我们需要对表格进行一些配置。首先,我们需要为表格的列设置“small”属性,这样它可以与父表格的数据对齐。另外,我们还需要添加“highlight-row”属性,以便在表格高亮显示当前行。例如: ``` <vxe-table :data="row.children" highlight-row :table-dynamic="{ 'scroll-y': '200px' }"> <vxe-table-column field="address" title="地址" width="120" small></vxe-table-column> <vxe-table-column field="phone" title="电话" width="140" small></vxe-table-column> </vxe-table> ``` 在这个例,我们通过“table-dynamic”属性对表格设置了一个垂直滚动条,以便在数据较多时进行滚动浏览。 3. 最后,我们还需要在父表格表格添加一些事件处理函数,以便处理用户的交互事件。例如,我们可以在父表格添加一个“expand-change”事件,以便在用户展开或收起表格时显示不同的icon。另外,我们还可以在表格添加“edit-closed”事件,以便在用户修改数据后自动保存并更新父表格的数据。 总之,j-vxe-table嵌套表格非常方便实用,大大提高了表格组件的灵活性和交互性。如果你正在开发一个需要嵌套表格的项目,那么j-vxe-table绝对是一个值得推荐的工具。 ### 回答3: J-vxe-table是一个基于Vue.js的表格组件库,提供了许多丰富的表格特性和功能。其嵌套表格是魅力之一。在实际应用,我们常常需要在一个父级表格嵌套多个表格,以展示更详细的信息。 J-vxe-table通过提供类似于树形菜单的展示形式来实现嵌套表格。我们可以通过设置columns、data等属性来初始化父级表格,并通过table-expand属性来启用嵌套表格的展示。 在父级表格,我们需要使用table-expand来定义“展开”自定义列,该列需要设置type为“expand”,并提供一个自定义的渲染函数。在渲染函数,我们可以通过slot-scope指令来访问父级表格的当前行数据,并使用vxe-grid组件来嵌套表格。通过设置columns、data等属性来初始化表格,最终实现嵌套表格的展示。 值得注意的是,J-vxe-table嵌套表格时,还提供了一些其他的特性和配置选项,如展开和收起行(table-expand-row、table-collapse-row)、展开和收起树形节点(tree-config)、带复选框的展开行(table-checkbox)等。这些特性和选项可以根据实际需求进行配置和定制,并且和嵌套表格组合使用,可以为用户带来更多的交互和体验。 总之,J-vxe-table是一个功能强大的表格组件库,其嵌套表格特性可以为我们提供更加灵活和丰富的表格展示方式。在应用,我们可以根据实际需求,通过适当的配置和定制,让J-vxe-table更好地服务于我们的业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值