el-table组件的封装

前言:仔细看懂本篇博客,玩转element table 不成问题 ,个人理解所谓封装,就是把经常都要公用的东西,拿出来,可以多次复用。公用方法,公用页面都可以封装。

其实封装也并不是有多难,思路也很简单,就是用JS来控制页面。页面动态性越强,组件越灵活,适用范围越广。

就vue+element的组件封装而言,先把所有功能在子页面实现。然后把js里面的动态值,拿到父组件里面去传过来,就完成了,其中技术也就掌握父子组件传值而已。
该组件封装适应于绝大多数table列表,可以自定义列

废话不多说看下例子

先上子组件代码 

<template>
  <div class="table-box">
    <el-table
      ref="tableData"
      v-loading="loading"
      :row-key="rowKey"
      :style="{ width: '100%', fontSize: fontSize + 'px' }"
      :show-header="showHeader"
      :data="tableData"
      :height="tableHeight"
      :summary-method="getSummaries"
      :show-summary="showSummary"
      :cell-style="cellStyle"
      :cell-class-name="tableCellClassName"
      :span-method="arraySpanMethod"
      :border="border"
      size="default"
      :highlight-current-row="highlightCurrentRow"
      v-bind="tableInfo"
      :stripe="isStripe"
      v-on="events"
    >
      <slot name="expand" />
      <!-- 多选 -->
      <el-table-column
        v-if="needSelect"
        :selectable="selectable"
        type="selection"
        width="55"
        :reserve-selection="isReserve"
      />
      <el-table-column v-if="hasIndex" label="序号" width="50" type="index" />
      <template v-for="(item, index) in tableColumn">
        <!-- 此列需要自定义 notTooltip  超出行是否隐藏 -->
        <el-table-column
          v-if="item.isSlot"
          :key="'%' + index"
          :show-overflow-tooltip="!item.notTooltip"
          v-bind="item"
          v-on="events"
        >
          <template slot-scope="{ row, $index }">
            <ex-slot
              v-if="item.render"
              :render="item.render"
              :row="row"
              :index="$index"
              :column="item"
              :class="item.prop"
              :default-value="item.defaultValue"
            />
            <slot v-else :name="item.prop" :row="row" />
          </template>
        </el-table-column>
        <!-- 正常列 -->
        <el-table-column
          v-else
          :key="'%' + index"
          show-overflow-tooltip
          v-bind="item"
          v-on="events"
        />
      </template>
      <el-table-column
        v-if="hasOperation"
        label="操作"
        :min-width="operationWidth"
        :fixed="fixed"
        align="center"
      >
        <!-- <template v-if="!btnButton || btnButton.length === 0" slot-scope="scope">
          <slot name="operation" :row="scope.row" :index="scope.$index" />
        </template> -->
        <template v-if="btnButton.length" slot-scope="{ row, column, $index }">
          <el-button
            v-for="(value, i) in btnButton"
            :key="'$' + i"
            :style="{ fontSize: fontSize + 'px' }"
            size="small"
            :type="value.type"
            :icon="value.icon"
            :class="value.class"
            :disabled="value.disabled && value.disabled(row, column, $index)"
            @click.stop="value.callback(row, column, $index)"
          >
            {{ value.text }}
          </el-button>
        </template>
      </el-table-column>
      <!-- 只针对团队会诊页面 吧v-else关闭 -->
    </el-table>
    <!-- 分页 -->
    <div
      v-if="isNeedPagination"
      style="display: flex; justify-content: flex-end; align-item: centerl; padding-top: 15px"
    >
      <el-pagination
        ref="pagination"
        :page-sizes="pageSizes"
        :page-size.sync="computedPageSize"
        :hide-on-single-page="isSinglePageHide"
        layout="total, sizes, prev, pager, next, jumper"
        :current-page.sync="computedCurrentPage"
        :total="total"
        :small="small"
        :pager-count="pagerCount"
        @current-change="currentChange"
        @size-change="sizeChange"
      />
    </div>
  </div>
</template>
<script>
import store from '@/store'
import { mapState } from 'vuex'
// 自定义组件的内容
const exSlot = {
  functional: true,
  props: {
    row: Object,
    render: Function,
    index: Number,
    column: {
      type: Object,
      default: null
    },
    defaultValue: [Number, String]
  },

  render: (h, ctx) => {
    const params = {
      row: ctx.props.row,
      index: ctx.props.index
    }
    const defaultValue = ctx.props.defaultValue
    params.column = ctx.props.column || {}
    return h(
      'div',
      {
        class: [
          params.column.prop || '',
          params.column.class || params.column.className || ''
        ].join('')
      },
      [ctx.props.render(h, params) || defaultValue]
    )
  }
}
export default {
  name: 'PublicTable',
  components: {
    'ex-slot': exSlot
  },
  props: {
    // key(唯一key值,和reserve-selection搭配使用)
    rowKey: {
      type: [Object, Function],
      default: () => ({})
    },
    // 多选框是否记住上一页数据(必须与row-key唯一值搭配使用)
    isReserve: {
      type: Boolean,
      default: false
    },
    // 单元格的 style 的回调方法
    cellStyle: {
      type: [Object, Function],
      default: () => ({})
    },
    small: {
      type: Boolean,
      default: false
    },
    pagerCount: {
      type: Number,
      default: 7
    },
    // 是否显示表头
    showHeader: {
      type: Boolean,
      default: true
    },
    // 是否显示合计
    showSummary: {
      type: Boolean,
      default: false
    },
    // 是否要高亮当前行
    highlightCurrentRow: {
      type: Boolean,
      default: true
    },
    // 自定义的合计计算方法
    getSummaries: {
      type: Function,
      default: () => {}
    },
    // 获取表格行列索引值
    tableCellClassName: {
      type: Function,
      default: () => {}
    },
    // 合并行或列
    arraySpanMethod: {
      type: Function,
      default: () => {}
    },
    // 是否需要多选
    needSelect: {
      type: Boolean,
      default: false
    },
    // 是否select需要特殊判断
    selectable: {
      type: Function,
      default: () => {
        return true
      }
    },
    // 是否需要序号
    hasIndex: {
      type: Boolean,
      default: false
    },
    // 默认是否选中第一列
    isSetCurrentRow: {
      type: Boolean,
      default: false
    },
    // 是否需要分页
    isNeedPagination: {
      type: Boolean,
      default: false
    },
    // 是否单页隐藏,默认为true
    isSinglePageHide: {
      type: Boolean,
      default: false
    },
    // 当前页页码,支持.sync修饰符
    currentPage: {
      type: Number,
      default: 1
    },
    // 每页数据条数, 支持.sync修饰符默认为每页10条
    pageSize: {
      type: Number,
      default: 20
    },
    // 数据总条数
    total: {
      type: Number,
      default: 0
    },
    // 每页多少数据
    pageSizes: {
      type: Array,
      required: false,
      default: () => [20, 40, 80, 100]
    },
    tableInfo: {
      type: Object,
      default: () => {}
    },
    // 获取数据时是否需要加载loading
    loading: {
      type: Boolean,
      default: false
    },
    tableData: {
      type: Array,
      default: () => []
    },
    // 表格展示数据
    tableColumn: {
      type: Array,
      default: () => []
    },
    // 是否需要操作列
    hasOperation: {
      type: Boolean,
      default: true
    },
    // 是否需要边框
    border: {
      type: Boolean,
      default: false
    },
    // 操作列
    btnButton: {
      type: Array,
      default: () => []
    },
    // 操作列宽度
    operationWidth: {
      type: String,
      default: '60px'
    },
    // 操作
    fixed: {
      type: [Boolean, String],
      default: false
    },
    // 表格方法
    events: {
      type: Object,
      default: () => {}
    },
    // 是否为斑马纹 table
    isStripe: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      fontSize: sessionStorage.getItem('fontSize') || ''
    }
  },
  // data() {
  //   return {
  //     // eslint-disable-next-line vue/no-dupe-keys
  //     tableData: []
  //   }
  // },
  computed: {
    computedCurrentPage: {
      get() {
        return this.currentPage
      },
      set(val) {
        this.$emit('update:currentPage', val)
      }
    },
    computedPageSize: {
      get() {
        return this.pageSize
      },
      set(val) {
        this.$emit('update:pageSize', val)
      }
    },
    tableHeight() {
      console.log('height', !this.isNeedPagination ? '100%' : 'calc(100% - 47px)')
      return !this.isNeedPagination ? '100%' : 'calc(100% - 47px)'
    },
    ...mapState({
      diagnosisSize: state => state.app.diagnosisSize
    })
  },
  watch: {
    '$parent.activeName'() {
      this.$nextTick(() => {
        this.$refs.tableData.doLayout()
      })
    },
    diagnosisSize: {
      handler(newValue) {
        this.fontSize = newValue
      }
    }
  },
  mounted() {
    if (this.isSetCurrentRow) {
      setTimeout(() => {
        this.$refs.tableData.setCurrentRow(this.tableData[0])
      }, 500)
    }
  },
  methods: {
    // 页面切换事件  通过 @currentChange 绑定
    currentChange(val) {
      this.$emit('currentChange', val)
    },
    // 每页条数切换事件,通过@sizeChange 绑定
    sizeChange(val) {
      this.$emit('sizeChange', val)
    },
    getTableRef() {
      return this.$refs.tableData
    }
  }
}
</script>
<style lang="scss" scoped>
.table-box {
  flex: 1;
  overflow: hidden;
  width: 100%;
  height: 100%;
}

::v-deep .el-table {
  border: 1px solid #dfe6ec;
}

::v-deep .el-table th {
  padding: 0;
  height: 40px;
  background: #f2f4fa;
  box-shadow: 0px 1px 0px 0px #ebedf0;
  // color: #191f25;
  color: #000;
  font-weight: 400;
}

::v-deep .el-table td {
  padding: 0;
  height: 40px;
}

::v-deep .el-table {
  width: 100%;

  .el-table__header-wrapper table,
  .el-table__body-wrapper table {
    // width: 100% !important;
  }

  .el-table__body,
  .el-table__footer,
  .el-table__header {
    // table-layout: auto;
  }
  .maxMinBtn {
    padding: 0 5px;
  }
}
::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell {
  background-color: #e6f3e2;
}
::v-deep .el-table__body tr.current-row {
  .flex_div {
    background: rgba(21, 91, 212, 0.3) !important;
  }
  td {
    background: rgba(21, 91, 212, 0.3) !important;
  }
  td {
    background: rgba(21, 91, 212, 0.2) !important;
  }
}
</style>

再上父组件代码

<template>
  <div class="tableBox">
    <PublicTable
      ref="zhenDuanWHTable"
      class="table"
      :loading="loading"
      :current-page="searchParams.pageNum"
      :total="total"
      :page-size="searchParams.pageSize"
      :table-data="tableData"
      :table-info="tableInfo"
      :table-column="columns"
      :btn-button="operations"
      :events="events"
      operation-width="150px"
      @sizeChange="handleSizeChange"
      @currentChange="handleCurrentChange"
    />
  </div>
</template>

<script>
import tableInfo from './mixins/tableInfo.js'
import PublicTable from '@/components/PublicTable/index.vue'
export default {
  components: {
    PublicTable
  },
  mixins: [tableInfo],
  data() {
    return {}
  },
  methods: {}
}
</script>

<style lang="scss" scoped>
.tableBox {
  display: flex;
  flex-direction: column;
  width: 100%;
  height: 600px;
  .table {
    height: calc(100% - 48px);
  }
}
</style>

再上mixins/tableInfo.js代码

import mockData from './mockData'
export default {
  data() {
    return {
      // 获取列表前是否loading加载
      loading: false,
      // 搜索查询的参数
      searchParams: {
        pageNum: 1,
        pageSize: 10
      },
      // table数据源
      tableData: mockData,
      // 表格项绑定的属性
      columns: [
        {
          prop: 'title',
          label: '审核描述',
          minWidth: '100px',
          align: 'center',
          formatter: row => (row.title ? row.title : '暂无标题')
        },
        {
          prop: 'statusDesc',
          minWidth: '100px',
          align: 'center',
          label: '审核状态'
        },
        {
          prop: 'createBy',
          minWidth: '100px',
          align: 'center',
          label: '申请人'
        },
        {
          sortable: 'custom',
          prop: 'createdTime',
          minWidth: '100px',
          align: 'center',
          label: '申请时间'
        },
        {
          prop: 'auditBy',
          minWidth: '100px',
          align: 'center',
          label: '审核人'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'auditTime',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'A',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'B',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'C',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'D',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'E',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'E',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'E',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'E',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'E',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'E',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'E',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'E',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'E',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'E',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'E',
          label: '审核时间'
        },
        {
          minWidth: '100px',
          align: 'center',
          prop: 'E',
          label: '审核时间'
        }
      ],
      // 表格绑定的属性
      tableInfo: {
        stripe: true,
        'highlight-current-row': true // 选中行高亮
      },
      events: {
        'row-dblclick': row => {
          //双击表格项触发的函数
          console.log(row)
        },
        'row-click': row => {
          // 单机表格项触发的函数
          console.log('row', row)
        }
      },
      // 操作列
      operations: [
        {
          text: '编辑',
          isShow: row => true, // 是否展示
          isDisable: row => true, // 是否禁用
          type: 'text',
          class: 'el-text-color',
          callback: row => {
            this.handleAddOrEdit('edit', row)
          }
        }
      ],
      total: 0
    }
  },
  mounted() {},
  methods: {
    // 每也条数改变
    handleSizeChange(pageSize) {
      this.searchParams.pageSize = pageSize
    },
    // 改变页数
    handleCurrentChange(pageNum) {
      this.searchParams.pageNum = pageNum
    },
    handleAddOrEdit(type, row) {
      if (type === 'edit') {
        this.visible = true
        this.infoData = row
      }
    }
  }
}

假数据mockData(不用管)

export default [
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  },
  {
    title: 'A',
    statusDesc: 1,
    createBy: '甲',
    createdTime: '2023-01-01 23:59:59',
    auditBy: '乙',
    auditTime: '2023-01-02 23:59:59'
  }
]

最后附上效果图

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
el-tableElement UI库中的一个组件,用于展示和操作表格数据。如果你想要封装el-table,可以按照以下步骤进行操作: 1. 创建一个新的Vue组件,比如TableWrapper。 2. 在TableWrapper组件中引入el-table,并将其作为模板的一部分。 3. 通过props将数据源、列配置等必要的参数传递给TableWrapper组件。 4. 在TableWrapper组件中使用props接收传递的参数,并将其传递给el-table。 5. 可以使用slot在TableWrapper组件中定义自定义的表头、表尾等内容,并将其插入到el-table中。 6. 可以使用events或者methods在TableWrapper组件中处理el-table的事件和方法。 下面是一个简单的示例代码: ```vue <template> <div> <el-table :data="tableData" :columns="tableColumns"> <!-- 自定义表头 --> <el-table-column label="姓名" prop="name"></el-table-column> <el-table-column label="年龄" prop="age"></el-table-column> </el-table> </div> </template> <script> export default { props: { tableData: { type: Array, default: () => [], }, tableColumns: { type: Array, default: () => [], }, }, } </script> ``` 然后你可以在另一个父组件中使用TableWrapper组件,并传递相应的数据和列配置: ```vue <template> <div> <table-wrapper :table-data="data" :table-columns="columns"></table-wrapper> </div> </template> <script> import TableWrapper from './TableWrapper.vue' export default { components: { TableWrapper, }, data() { return { data: [ { name: '张三', age: 18 }, { name: '李四', age: 20 }, ], columns: [ { label: '姓名', prop: 'name' }, { label: '年龄', prop: 'age' }, ], } }, } </script> ``` 这样,你就将el-table封装到了TableWrapper组件中,并可以通过传递数据和列配置来渲染表格。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值