公共表格封装

<template>  <el-table :data="datas" :span-method="spanMethod" @selection-change="select" :default-sort="sort" stripe>    <template v-for="(config, index) in config">      <slot v-if="config.slot" :name="config.slot"></slot>      <el-table-column        v-bind="config"        :resizable="false"        :key="index"        height="20"      ></el-table-column>    </template>  </el-table></template><script>export default {  name: "mergeTable",  props: {    datas: {//数据      type: Array,      required: true,      default: () => [],    },    config: {//表头      type: Array,      required: true,      default: () => [],    },    mergeKeys: {//合并      type: Array,      default: () => [],    },    select:{//多选      type:Function,      default:()=>{}    },    sort:{//排序      type:Object,      default:()=>{}    }  },  data() {    return {      mergeData: {},      mergePos: {},    };  },  mounted() {    this.getSpanArr(this.datas, this.mergeKeys);  },  methods: {    getSpanArr(tableData, keyName) {      const [mergeData, mergePos] = [this.mergeData, this.mergePos];      keyName.forEach((kitem) => {        tableData.forEach((data, i) => {          if (i === 0) {            mergeData[kitem] = mergeData[kitem] || [];            mergeData[kitem].push(1);            mergePos[kitem] = 0;          } else {            if (data[kitem] === tableData[i - 1][kitem]) {              mergeData[kitem][mergePos[kitem]] += 1;              mergeData[kitem].push(0);            } else {              mergeData[kitem].push(1);              mergePos[kitem] = i;            }          }        });      });    },    spanMethod({ row, column, rowIndex, columnIndex }) {      if (this.mergeKeys.includes(column.property)) {        const _row = this.mergeData[column.property][rowIndex];        const _col = _row > 0 ? 1 : 0;        return {          rowspan: _row,          colspan: _col,        };      }    },  },};</script>

组件中应用

<mergeTable         :config="tableConfig"         :datas="list"         :select="handleSelectionChange"         :sort="{prop: 'update_at', order: 'descending'}"      >        <el-table-column slot="select" type="selection" width="50" align="center" />        <el-table-column slot="name" label="名称" align="center">          <template slot-scope="{ row }"></template>        </el-table-column>        <el-table-column slot="owner" label="运维负责人" align="center">          <template slot-scope="{ row }"></template>        </el-table-column>      </mergeTable>data(){    return    {        tableConfig:[          { prop: "select", slot: "select" },          { prop: "name", slot: "name" },          { prop: "business", slot: "business" },          { prop: "developer", slot: "developer" },          { prop: "owner", slot: "owner" },          { prop: "tester", slot: "tester" },          { prop: "update_at", label: "最近拜访", sortable:"sortable",align: "center" },      ]     }}