<template>
  <!-- 组件功能 -->
  <!-- 根据element table组件进行二次封装, 依据数据 动态生成表格数据 参数查看底下props -->
  <el-table
    :data="tableData"
    v-loading="tableLoading"
    border
    :header-cell-style="HeaderRowStyle"
    style="width: 100%"
    :height="setTableHeight"
    @select-all="selectAllData"
    @select="selectData"
    :ref="tableRef"
  >
    <!-- 表格列类型  -->
    <el-table-column
      v-if="hasSelection"
      type="selection"
      align="center"
      width="50"
    />

    <el-table-column
      v-if="hasIndex"
      type="index"
      label="序号"
      align="center"
      width="80"
    />

    <template v-for="(item, i) in tableConfig">
      <!-- 特殊渲染列 -->
      <!-- 目前操作列有单独渲染,这块也支持, 之前代码有使用 故没有做修改 -->
      <el-table-column
        v-if="item.render"
        :key="i"
        :prop="item.prop ? item.prop : null"
        :label="item.label ? item.label : null"
        :align="item.align ? item.align : 'center'"
        :formatter="item.formatter ? item.formatter : null"
        :type="item.type ? item.type : null"
        :width="item.width ? item.width : 0"
        :fixed="fixed ? fixed : null"
      >
        <template slot-scope="scope">
          <column-slot
            :render="item.columnRender"
            :row="scope.row"
            :index="scope.$index"
            :column="item"
          />
        </template>
      </el-table-column>
      <!-- 正常内容列 -->
      <el-table-column
        v-else
        :key="i"
        :prop="item.prop ? item.prop : null"
        :label="item.label ? item.label : null"
        :align="item.align ? item.align : 'center'"
        :formatter="item.formatter ? item.formatter : null"
        :type="item.type ? item.type : null"
        :width="item.width ? item.width : 0"
      />
    </template>

    <el-table-column
      v-if="!hideHandleArea"
      label="操作"
      :fixed="fixed ? fixed : null"
      align="center"
      :width="tableHandleWidth ? tableHandleWidth : 100"
    >
      <template slot-scope="scope">
        <el-button
          v-if="tableBtnConfig.view"
          type="text"
          @click="view(scope.row)"
          >查看</el-button
        >
        <el-button
          v-if="tableBtnConfig.edit"
          type="text"
          @click="edit(scope.row)"
          >编辑</el-button
        >
        <el-button
          v-if="tableBtnConfig.delete"
          type="text"
          @click="remove(scope.row, scope.$index)"
          >删除</el-button
        >
        <!-- 自定义操作按钮 -->
        <span v-if="tableBtnConfig.extends && tableBtnRender">
          <tableBtn
            :render="tableBtnRender"
            :row="scope.row"
            :index="scope.$index"
          ></tableBtn>
        </span>
      </template>
    </el-table-column>
  </el-table>
</template>
<script>
import { deepClone } from "@/utils/tools";
var tableBtn = {
  functional: true,
  props: {
    row: Object,
    render: Function,
    index: Number,
  },
  render: (h, content) => {
    const params = {
      row: content.props.row,
      index: content.props.index,
    };
    return content.props.render(h, params);
  },
};

// 表格单元格自定义内容函数式组件
var columnSlot = {
  functional: true,
  props: {
    row: Object,
    render: Function,
    index: Number,
    column: {
      type: Object,
      default: null,
    },
  },
  render: (h, content) => {
    const params = {
      row: content.props.row,
      index: content.props.index,
    };
    if (content.props.column) params.column = content.props.column;
    return content.props.render(h, params);
  },
};
export default {
  name: "zzsTable",
  components: {
    tableBtn,
    columnSlot,
  },
  /**
   *
   * 组件接收参数说明
   *  tableData:            表格数据
   *  tableLoading          加载loading
   *                        表格列类型设置
   *  hasSelection:         设置了 selection 则显示多选框;
   *  hasIndex:             设置了 index 则显示该行的索引(从 1 开始计算)
   *
   *   tableConfig           表格配置  type: Array  例子:
   *                          [
   *                            {
   *                              prop:''       对应列内容的字段名
   *                              label: ''     显示的标题
   *                              render:       是否需要渲染特殊列  type: Boolean
   *                              columnRender  自定义内容渲染 type: Function
   *                                            可用render渲染函数  或者 jsx
   *                              align: center 对齐方式
   *                              formatter:    用来格式化内容(函数) Function(row, column, cellValue, index) 参见element官网
   *                              width:200     对应列的宽度
   *                              type:         对应列的类型。如果设置了 selection 则显示多选框;如果设置了 index 则显示该行的索引(从 1 开始计算);如果设置了 expand 则显示为一个可展开的按钮
   *                             }
   *                          ]
   *
   *  tableConfig           表格配置
   *  HeaderRowStyle        表头行样式    默认配置 { background: "#f5f7fa", color: "#555"}
   *  hideHandleArea        是否隐藏表格操作  false 隐藏   true显示
   *  tableHandleWidth      表格操作区域宽度
   *
   *  fixed                  列是否固定在左侧或者右侧,true 表示固定在左
   *                         也可以设置直接设置位置 left, right
   *
   * tableBtnConfig          表格操作栏按钮配置  配置字段如下:
   *                         view type:Boolean 是否显示查看按钮
   *                         edit type:Boolean 是否显示编辑按钮
   *                         delete type:Boolean 是否显示删除按钮
   *                         extends 其他自定义按钮
   * tableBtnRender          表格操作栏操作栏自定义按钮渲染 type:function
                              可以用render 渲染函数生成  或者 用jsx 直接写 根据情况使用
                              例子:   tableBtnRender: (h, data)=>{
                                 return h("el-button", {
                                         attrs: {
                                           type: "text",
                                           },
                                         domProps: {
                                           innerHTML: "数据详情",
                                          },
                                         on: {
                                           click: () => {
                                             this.seeDetail(data.row);
                                           },
                                         },
                                     });
                                      }
   */
  props: {
    // 表格数据
    tableData: {
      type: Array,
      default: () => [],
    },
    hasSelection: {
      type: Boolean,
      default: false,
    },
    hasIndex: {
      type: Boolean,
      default: false,
    },
    hasExpand: {
      type: Boolean,
      default: false,
    },
    tableColumnType: {
      type: Array,
      default: () => [],
    },

    tableConfig: {
      type: Array,
      default: () => [],
    },

    HeaderRowStyle: {
      type: Object,
      default: () => {
        return {
          background: "#ededed",
          color: "#555",
        };
      },
    },

    hideHandleArea: {
      type: Boolean,
      default: true,
    },

    tableLoading: {
      type: Boolean,
      default: false,
    },

    tableHandleWidth: {
      type: Number,
      default: null,
    },

    fixed: {
      type: [String, Boolean],
      default: null,
    },

    tableBtnConfig: {
      type: Object,
      default: () => {
        return {
          isShowViewBtn: false,
          isShowEditBtn: false,
          isShowDeleteBtn: false,
        };
      },
    },
    setTableHeight: {
      type: String,
      default: () => {
        return "100%";
      },
    },
    tableRef: {
      type: String,
      default: () => {
        return "tableRef";
      },
    },
    tableBtnRender: Function,
  },
  data() {
    return {
      selectRowData: [],
    };
  },
  methods: {
    // 获取选中表格项
    getSelectRowData() {
      return this.selectRowData;
    },
    // 表格单个选择数据
    selectData(selection, row) {
      this.selectRowData = deepClone(selection);
    },
    // 表格全选数据
    selectAllData(selections) {
      this.selectRowData = deepClone(selections);
    },
    // 操作 删除按钮
    remove(row, index) {
      this.$emit("remove", row, index);
    },
    // 操作 编辑按钮
    edit(val) {
      this.$emit("edit", val);
    },
    // 操作 查看按钮
    view(val) {
      this.$emit("view", val);
    },
  },
  updated() {
    this.$refs.tableRef.bodyWrapper.scrollTop = 0;  //滚动条重置
  },
};
</script>

使用方法 (简单的使用方法)

<baseTable
        v-loading="loading"
        element-loading-text="加载中"
        :table-data="checkList"
        :table-config="tableConfig"
        :has-index="tableIndex"
        :hide-handle-area="hideHandleArea"
        :table-btn-config="tableBtnConfig"
        :tableBtnRender="tableBtnRender"
      />

 // 自定义操作按钮
 tableBtnConfig: {
        extends: true,
      },
      tableBtnRender: (h, data) => {
        return h("span", {
          class: {
            handler: true,
          },
          domProps: {
            innerHTML: "详情",
          },
          on: {
            click: () => {
              return this.detail(data.row);
            }
          }
        });
        },
    // 表头对应字段
      tableConfig: [
        { label: "查验流水号", prop: "cylsh" , width:'140px'},
        { label: "查验区序号", prop: "cyqxh" },
        { label: "发证机关", prop: "fzjg" , width:'80px' },
        { label: "号牌号码", prop: "hphm" , width:'100px',
          formatter: (row) => {
            return this.getHphm(row);   // 转换表格内容
          } 
        },
        { label: "号牌种类", prop: "hpzl" },
        { label: "车辆识别代号", prop: "clsbdh" },
        { label: "查验员姓名", prop: "cyyxm" },
        { label: "查验日期", prop: "cyrq" , width:'160px' },
        // { label: "更新时间", prop: "gxsj" },
      ],
      tempTableData: []    // 表格数据