Vue+Elementui el-table组件二次封装

index.vue表格组件源码

<template>
  <div style="height: 100%;">
    <!-- 自定义头部标签操作按钮 -->
    <div style="padding: 3px 0;" v-if="headButton">
      <slot name="second"></slot>
    </div>
    <el-table v-loading="loading" :data="tableData" :row-key="rowKey" border @sort-change='sortChange' @select="select"
              :highlight-current-row="true" @select-all="select"
              @selection-change="handleSelectionChange"
              :header-cell-style="{'text-align':headerAlign,'background':'#eef1f6'}" @current-change="handleCurrentChange"
              :height="calcHeight"
              v-bind="$attrs"
              v-on="$listeners">
      <!-- v-bind="$attrs" 可以从外部直接使用el-table组件的属性值 -->
      <!-- v-on="$listeners" 可以从外部直接调用el-table组件的方法 -->
      <el-table-column type="selection" v-if="choice" width="50" :align="headerAlign" :key="Math.random()">
      </el-table-column>
      <!-- 序号 -->
      <el-table-column label="序号" v-if="serialNumber" fixed="left" width="50" type="index" :align="headerAlign"
                       :key="Math.random()">
      </el-table-column>
      <!-- 动态表头 -->
      <template v-for="(item, index) in tableLabel">
        <el-table-column
          :key="index"
          :prop="item.prop"
          :label="item.label"
          :align="item.align?item.align:'left'"
          :formatter="item.render"
          :show-overflow-tooltip="item.tooltip || false"
          :fixed="item.fixed"
          :index="index"
          :width="item.width"
          :sortable="item.sort"
        >
          <!-- 动态具名插槽 -->
          <div v-if="item.slot" slot-scope="scope">
            <slot :name="item.prop" :row="scope.row"></slot>
          </div>
          <!-- 处理render函数 -->
          <div v-else-if="item.render" slot-scope="scope">
            {{item.render(scope.row)}}
          </div>
          <div v-else slot-scope="scope">
            {{scope.row[item.prop]}}
          </div>
        </el-table-column>
      </template>
    </el-table>

  </div>
</template>

<!-- /**
 * 组件说明
 * 属性:
 * 参数                     说明                           类型                    默认值
 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * tableData              列表 的数据源                   Array                      []
 * treeProps              支持树类型的数据的列表显示       Object                     {children: 'children'}
 * rowKey                 树类型的数据 列表必须要指定        String                     '_id'
 * serialNumber           是否需要序号                     Boolean                    true
 * headerAlign               表头对齐方式/复选框/序号              String                    'left'/'center'/'right'
 * tableLabel               动态表头渲染数组                Array                     []
 * choice                   是否开启多选复选框                Boolean                 false
 * operation               操作列表按钮                    Object                     {}
 * total                   分页总页数                     number                     0

 * 回调事件:
 * select  获取复选框选中对象 返回数组
 * sortChange     获取当前点击表头指定排序结果
 * handleCurrentPage     每次切换页数触发并且回调页数
 * handleNumberChange     每次切换展示的条数触发并且回调
 */ -->
<script>
  export default {
    components: {

    },
    props: {
      headButton: {
        type: Boolean,
        default: false
      },
      tableData: {
        type: Array,
        default: () => ([])
      },
      treeProps: {
        type: Object,
        default: () => ({
          children: 'children'
        })
      },
      rowKey: {
        type: String,
        default: 'id'
      },
      calcHeight:{
        type: String,
        default: 'calc(100vh - 200px)'
      },
      serialNumber: {
        type: Boolean,
        default: false
      },
      headerAlign: {
        type: String,
        default: 'left'
      },
      tableLabel: {
        type: Array,
        default: () => ([])
      },
      loading:{
        type: Boolean,
        default: true
      },
      choice: {
        type: Boolean,
        default: false
      },
      operation: {
        type: Object,
        default: () => ({})
      },
      total: {
        type: Number,
        default: 0
      },

    },
    data() {
      return {
      }
    },
    watch: {
    },
    created() {
    },
    methods: {
      // 复选框勾选
      select(row) {
        this.$emit('select', row)
      },
      // 排序
      sortChange(column, prop, order) {
        this.$emit('sortChange', column)
      },
      // 点击列表 获取数据
      handleCurrentChange(row) {
        this.$emit('handleCurrentChange', row)
      },

      handleSelectionChange(row){
        this.$emit('handleSelectionChange', row)
      }
    }
  }
</script>
<style scoped lang="scss">
  /* 默认el-table 行高过于高,这里设置减少padding之间的间距 */
  ::v-deep th {
    padding: 2px 0;
  }

  ::v-deep .el-table td {
    padding: 5px 0;
  }
</style>

使用示例

父组件里面

自定义列可以使用插槽 列数据格式展示可以使用render函数

    <table-list :loading="loading" :tableData="myProcessList" :tableLabel="tableLabel" :choice="true" pagingPosition="center" :paging="true"
                :operation="operation" :calcHeight="calcHeight" :fixedHeight="500" :total="total" headerAlign='center'
                 :headButton="true" @handleCurrentChange="handleCurrentChange" @handleSelectionChange="handleSelectionChange">
<!--      <template v-slot:second>-->
<!--        <el-button type="primary" size="mini" ><i class="el-icon-download"></i> 导出</el-button>-->
<!--      </template>-->
      <template slot-scope="scope" slot="ticketCode">
        <div @click="handleFlowRecord(scope.row)" style="color:#1890ff;cursor:pointer;">{{scope.row.finishTime==null ?scope.row.procVars && scope.row.procVars.ticketCode || ('LC'+'_'+scope.row.procVars.procDefId && scope.row.procVars.procDefId.split(":")[0]+'_'+scope.row.taskId) :scope.row.startUserId || ''}}</div>
      </template>
      <template slot-scope="scope" slot="category">
        <dict-tag :options="dict.type.sys_process_category" :value="scope.row.category" />
      </template>
      <template slot-scope="scope" slot="version">
        <el-tag size="medium">v{{ scope.row.procDefVersion }}</el-tag>
      </template>
      <template slot-scope="scope" slot="ticketAbstract">
        <div v-if="scope.row.procVars.ticketAbstract!=='' && scope.row.procVars.ticketAbstract!==null && typeof(scope.row.procVars.ticketAbstract) !== 'undefined'" @click="handleFlowRecord(scope.row)" style="color: #1890ff; cursor: pointer">
          <div v-if="scope.row.procDefName.indexOf('操作票')>-1"><el-tag type="success" size="mini">操作任务:</el-tag> {{ scope.row.procVars.ticketAbstract || '' }}</div>
          <div v-else-if="scope.row.procDefName.indexOf('缺陷')>-1 && !scope.row.procVars.ticketAbstract === false"><el-tag type="danger" size="mini">缺陷详情:</el-tag>&nbsp;<el-tag type="info" size="mini" v-if="!scope.row.procVars.departmentShould === false">{{scope.row.procVars.departmentShould}}</el-tag> {{ scope.row.procVars.ticketAbstract || '' }}</div>
          <div v-else-if="scope.row.procDefName.indexOf('工作票')>-1"><el-tag type="waring" size="mini">工作内容:</el-tag> {{ scope.row.procVars.ticketAbstract || '' }}</div>
        </div>
        <div v-else> 暂无内容 </div>
      </template>
      <template slot-scope="scope" slot="flowStatus">
        <el-tag v-if="scope.row.finishTime == null" size="mini">进行中</el-tag>
        <el-tag type="success" v-else size="mini">已完成</el-tag>
      </template>
      <template slot-scope="scope" slot="workName">
        <label v-if="scope.row.assigneeName"
        >{{ scope.row.assigneeName }}
          <el-tag type="info" size="mini" v-if="!scope.row.assigneeDeptName === false">{{ scope.row.assigneeDeptName }}</el-tag></label
        >
      </template>
      <template slot-scope="scope" slot="handleButton">
        <el-button @click="handleFlowRecord(scope.row)" icon="el-icon-view" type="text" size="small">详情</el-button>
        <el-button
          @click="handleDelete(scope.row)"
          type="text"
          size="small"
          icon="el-icon-delete"
          v-hasPermi="['system:deployment:remove']"
        >删除</el-button
        >
      </template>
    </table-list>

表格数据:

      tableLabel:[
        {
          prop: 'ticketCode',
          label: '流程编号',
          align:'left',
          sort:true,
          fixed:true,
          slot:'ticketCode',
          width:180
        },
        {
          prop: 'procDefName',
          label: '流程名称',
          align: 'left',
          tooltip:true,
          width:260
        },
        {
          prop: 'category',
          label: '流程分类',
          align: 'center',
          sort:true,
          width:150,
          slot:'category'
        },
        {
          prop: 'ticketAbstract',
          label: '内容摘要',
          align: 'left',
          slot: "ticketAbstract",
          width:260,
          tooltip:true
        },
        {
          prop: 'version',
          label: '流程版本',
          align: 'center',
          slot:'version',
          width:90
        },
        {
          prop: 'createTime',
          label: '提交时间',
          align: 'center',
          width:180
        },
        {
          prop: 'flowStatus',
          label: '流程状态',
          align: 'center',
          slot: "flowStatus",
          width:100,
        },
        {
          prop: 'duration',
          label: '耗时',
          align: 'center',
          width:150
        },
        {
          prop: 'taskName',
          label: '当前进度',
          align: 'center',
          width:100,
          tooltip:true
        },
        {
          prop: 'workName',
          label: '办理人',
          align: 'left',
          width:150,
          tooltip:true,
          slot:'workName',
        },
        {
          prop: 'handleButton',
          label: '操作',
          align: 'center',
          width:150,
          fixed:'right',
          slot:'handleButton',
        }
      ],
相关推荐
customer089 分钟前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
清灵xmf9 分钟前
TypeScript 类型进阶指南
javascript·typescript·泛型·t·infer
小白学大数据16 分钟前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫
qq_3901617725 分钟前
防抖函数--应用场景及示例
前端·javascript
334554321 小时前
element动态表头合并表格
开发语言·javascript·ecmascript
John.liu_Test1 小时前
js下载excel示例demo
前端·javascript·excel
PleaSure乐事1 小时前
【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案
前端·javascript·react.js·前端框架·webstorm·antdesignpro
哟哟耶耶1 小时前
js-将JavaScript对象或值转换为JSON字符串 JSON.stringify(this.SelectDataListCourse)
前端·javascript·json
getaxiosluo1 小时前
react jsx基本语法,脚手架,父子传参,refs等详解
前端·vue.js·react.js·前端框架·hook·jsx
理想不理想v1 小时前
vue种ref跟reactive的区别?
前端·javascript·vue.js·webpack·前端框架·node.js·ecmascript