vue3+element 动态表头

<template>
  <div class="tableBox">
    <h2>Vue3 + Element plus 动态行合并表格</h2>
    <el-table :data="tableData" style="width: 100%" @row-click="getRow" border>
      <el-table-column type="index" label="序号" width="70"></el-table-column>
      <el-table-column
        :prop="item.prop"
        :label="item.label"
        :type="item.type"
        :width="item.width"
        :fixed="item.fixed"
        :header-align="item.headerAlign"
        :sortable="item.sortable"
        show-overflow-tooltip
        v-for="(item, index) in tableHeader"
        :key="index"
      >
        <template #default="scope">
          <!-- 除操作option和expand展开以外的 -->
          <p v-if="item.prop !== 'option' && !item.type">
            <!-- 在此处table数据中添加formatter -->
            {{
              scope.row.formatter
                ? scope.row.formatter(scope.row[item.prop], item.prop)
                : scope.row[item.prop]
            }}
          </p>
          <!-- 仅包含操作option和expand展开以外的 -->
          <div v-if="item.prop == 'option' && !item.type">
            <!-- 仅展示图标用类名修正样式 -->
            <el-button
              :class="item.onlyIcon ? 'hasIcon' : ''"
              v-for="item in scope.row[item.prop]"
              @click.native.stop="getDetail(item, scope.row)"
              :type="item.type"
              :size="item.size"
              :icon="item.icon"
              >{{ item.name }}
            </el-button>
          </div>
          <!-- 展开部分业务 -->
          <div v-if="item.type == 'expand'">{{ scope.row }}</div>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script setup>
import { ref } from "vue";
// 动态表头el-table-column遍历获得
/* 
  type 对应列的类型selection / index / expand
  prop  字段名称
  label 显示的标题
  width 对应列的宽度
  fixed 列是否固定在左侧或者右侧。 true / 'left' / 'right'
  sortable  对应列是否可以排序  false
  header-align  表头对齐方式  left / center / right
*/
const tableHeader = [
  {
    type: "expand",
    prop: "birth",
    label: "",
    width: 60,
    align: "center",
    fixed: "left",
    headerAlign: "center",
  },
  {
    prop: "name",
    label: "姓名",
    width: 100,
    sortable: true,
    headerAlign: "center",
  },
  {
    prop: "phone",
    label: "电话",
    width: 150,
  },
  {
    prop: "province",
    label: "省份",
    width: 100,
  },
  {
    prop: "city",
    label: "市区",
    width: 100,
  },
  {
    prop: "address",
    label: "详细地址",
    width: 220,
  },
  {
    prop: "option",
    label: "操作按钮",
  },
];
const tableData = [
  {
    name: "张三",
    province: "上海市",
    city: "普陀区",
    address: "金沙江路 1518 弄",
    birth: "2016-05-02",
    phone: "12345678910",
    option: [
      {
        name: "",
        icon: "Edit",
        size: "small",
        type: "primary",
        onlyIcon: true,
      },
      {
        name: "编辑",
        type: "danger",
        icon: "Check",
        size: "small",
        onlyIcon: false,
      },
    ],
    formatter: (row, index) => {
      switch (index) {
        case "name":
          return "formatter" + row;
        case "address":
          return "address" + row;
        default:
          return row;
      }
    },
  },
  {
    name: "李四",
    birth: "2016-05-02",
    province: "上海市",
    city: "普陀区",
    address: "金沙江路 1517 弄",
    age: 19,
    phone: "12345678911",
    option: [
      {
        name: "",
        type: "success",
        icon: "Message",
        size: "small",
        onlyIcon: true,
      },
      {
        name: "编辑",
        type: "info",
        icon: "Star",
        size: "default",
        onlyIcon: false,
      },
    ],
  },
  {
    name: "王五",
    birth: "2016-05-03",
    province: "上海市",
    city: "普陀区",
    address: "金沙江路 1519 弄",
    phone: "12345678912",
    option: [
      {
        name: "新增",
        type: "success",
        icon: "Message",
        size: "small",
        onlyIcon: true,
      },
      {
        name: "",
        type: "info",
        icon: "Star",
        size: "default",
        onlyIcon: true,
      },
    ],
  },
];

const getDetail = (info, detail1) => {
  console.log(info);
  console.log(detail1);
};
const getRow = (row, column, event) => {
  console.log(row, column, event, "getRow");
};
const getFormatter = (row, column, cellValue, index) => {
  console.log("row, column, cellValue, index", row, column, cellValue, index);
};
</script>

<style scoped lang="scss">
.tableBox {
  ::v-deep {
    .hasIcon span {
      margin-right: 0;
      margin-left: 0;
    }
  }
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值