el-table 实现嵌套表格的思路及完整功能代码

要实现的需求是这样的:
在这里插入图片描述
本来我是用 el-table 的 :span-method 方法实现的,但发现合并起来有问题,跟我的需求差距有些大,于是我想到了嵌套表格。但是嵌套完之后的样子也是很奇怪:
在这里插入图片描述
不要气馁,思路还是对的,只要改下样式就好了,于是就有了以下的代码:

<template>
  <el-table
    border
    :data="tableData"
    v-loading="loading"
    class="el-child-table"
  >
    <el-table-column
      prop="applyDate"
      label="申请日期"
      align="center"
      width="120px"
    >
    </el-table-column>
    <el-table-column
      prop="table"
      label="子表"
      class-name="has-child"
      :render-header="renderHeader"
    >
      <template slot-scope="scope">
        <el-table
          
          :data="scope.row.details"
          class="child-table"
          :show-header="false"
        >
        <el-table-column
            prop="startDate"
            align="center"
            label="开始日期"
            width="120px"
          ></el-table-column>
          <el-table-column
            prop="endDate"
            align="center"
            label="结束日期"
            width="120px"
          ></el-table-column>
          <el-table-column
            prop="applyDay"
            align="center"
            label="申请天数"
            width="120px"
          ></el-table-column> 
           <el-table-column label="操作" align="center" width="220px">
            <el-button type="text" @click="viewItem(scope.row)">查看</el-button>
          </el-table-column> 
        </el-table>
      </template>
    </el-table-column>
    
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      loading: false,
      childColumn: [
        {
          label: "起始日期",
          key: 'startDate',
          width: "120px",
        },
        {
          label: "结束日期",
          key: 'endDate',
          width: "120px",
        },
        {
          label: "申请天数",
          key: 'applyDay',
          width: "120px",
        },
        {
          label: "操作",
          width: "220px",
        }
      ],
      tableData: [
        {
          applyDate: '2016-05-02',
          details: [
          {
            startDate: '2016-05-02',
            endDate: '2016-05-02',
            applyDay: 5
          },{
            startDate: '2016-05-02',
            endDate: '2016-05-02',
            applyDay: 5
          }
          ]
        },
        {
          applyDate: '2016-05-02',
          details: [
          {
            startDate: '2016-05-02',
            endDate: '2016-05-02',
            applyDay: 5
          },{
            startDate: '2016-05-02',
            endDate: '2016-05-02',
            applyDay: 5
          }
          ]
        },{
          applyDate: '2016-05-02',
          details: [
          {
            startDate: '2016-05-02',
            endDate: '2016-05-02',
            applyDay: 5
          },{
            startDate: '2016-05-02',
            endDate: '2016-05-02',
            applyDay: 5
          }
          ]
        }
      ]
    };
  },
  methods: {
    renderHeader(h, { column, $index }) {
      const childTable = this.childColumn.map((item) => {
        return h(
          "div",
          {
            style: {
              width: item.width,
              padding: "0 10px",
              textAlign: "center",
              flexShrink: 0,
              flexGrow: 0,
            },
          },
          item.label
        );
      });
      return h(
        "div",
        {
            style: {
              display: 'flex'
            },
          },
      
        childTable
      );
    },
    viewItem(row){}
  }
}
</script>

<style scoped lang="scss">
.has-child {
  padding: 0px !important;
  // display: none;
  & > .cell {
    padding: 0 !important;
  }
  ::before {
    height: 0;
  }
  .child-table {
    background-color: transparent;
    .cell{
      line-height: 34px;
    }
  }
  .el-table--enable-row-hover .el-table__body tr:hover > td.el-table__cell {
    background-color: transparent;
  }
  .el-table__body tr.current-row > td.el-table__cell,
  .el-table__body tr.selection-row > td.el-table__cell {
    background-color: transparent;
  }
  tr {
    background-color: transparent;
  }
  .child-head {
    display: flex!important;
  }
  ::v-deep .el-table .el-table__cell{
    padding: 0;
  }
  ::v-deep .el-table .cell{
    line-height: 34px;
  }
}
</style>

总算功夫不负有心人,最终效果还是让我实现了。
在这里插入图片描述

总结知识点

这里总结以下要点啊,
首先嵌套就是 el-table 中再套一个 el-table,但重点是子表格不要显示表头,而且样式要自己写,尤其是要通过 :render-header 重写表格样式。这里只是粗略实现了样式,需要的同学自行优化样式。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
el-table展开行表格嵌套表格可以通过以下步骤实现: 1.在el-table中定义一个scoped slot(例如,slot-scope="scope"),以便访问每一行的数据。 2.在scoped slot中创建一个新的el-table组件,用于显示嵌套表格。设置el-table的data属性为当前行的数据(例如,:data="scope.row.items")。 3.在嵌套表格中定义列(例如,使用el-table-column组件),并在其中填充数据。 4.如果需要进一步嵌套表格,则可以在嵌套表格中创建另一个el-table组件,并在其中重复上述步骤。 下面是一个示例代码: ``` <template> <el-table :data="tableData"> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="age" label="Age"></el-table-column> <el-table-column label="Items"> <template slot-scope="scope"> <el-table :data="scope.row.items"> <el-table-column prop="itemName" label="Item Name"></el-table-column> <el-table-column prop="itemPrice" label="Item Price"></el-table-column> </el-table> </template> </el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: 'John', age: 22, items: [ { itemName: 'Item 1', itemPrice: 10 }, { itemName: 'Item 2', itemPrice: 20 }, ], }, { name: 'Mary', age: 30, items: [ { itemName: 'Item 3', itemPrice: 15 }, { itemName: 'Item 4', itemPrice: 25 }, ], }, ], }; }, }; </script> ``` 在这个示例中,我们在“Items”列中创建了一个嵌套el-table组件,并使用scope.row.items作为数据源。在嵌套表格中,我们定义了两个列,分别显示“Item Name”和“Item Price”。这样,当用户展开行时,就会显示嵌套表格
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码搬运媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值