vue+element ui table組件封裝,使用render渲染

後臺管理常常會用到表格,一開始封裝了一個經常使用的功能性表格,點擊這裏

後來因爲需求增長,在表格中還會用到switch,select,input等多種組件,每次都要在html中增長<el-table-column></el-table-column>, 維護起來至關麻煩,就想到了使用render渲染。

 組件內部封裝代碼:

<template>
  <el-table :data="tableData" size="medium" fit
            :header-cell-style="{height: '40px',padding: '0',background: '#f7f9fa','font-size': '12px',color: '#8590a6'}"
            :row-style="{'font-size': '12px',color: '#212121'}"
            ref="multipleTable" border stripe
            @sort-change="handleSort"
            @filter-change="filterHandler"
            @row-click="handleRowClick">
    <el-table-column v-for="(th, key) in tableHeader"
                     :key="key"
                     :prop="th.prop"
                     :label="th.label"
                     :fixed="th.fixed"
                     :sortable="th.sortable?'custom':false"
                     :filters="th.filters"
                     :column-key="th.columnKey"
                     :filtered-value="th.filteredValue"
                     :filter-multiple="th.filterMultiple"
                     :min-width="th.minWidth" align="center">
      <template slot-scope="scope">
        <ex-slot v-if="th.render" :render="th.render" :row="scope.row" :index="scope.$index" :column="th" />
        <span v-else>{{ scope.row[th.prop] || '-' }}</span>
      </template>
    </el-table-column>
  </el-table>
</template>

<script>
  // 自定義內容的組件
  var exSlot = {
    functional: true,
    props: {
      row: Object,
      render: Function,
      index: Number,
      column: {
        type: Object,
        default: null
      }
    },
    render: (h, data) => {
      const params = {
        row: data.props.row,
        index: data.props.index
      }
      if (data.props.column) params.column = data.props.column
      return data.props.render(h, params)
    }
  }
  export default {
    name: 'comp-table',
    components: { exSlot },
    props: {
      // 表格數據
      tableData: {
        type: Array,
        default: function () {
          return []
        }
      },
      // 表頭數據
      tableHeader: {
        type: Array,
        default: function () {
          return []
        }
      }
    },
    methods: {
      // 排序事件
      handleSort (sort) {
        this.$emit('sort-events', sort)
      },
      // 篩選事件
      filterHandler (filters) {
        this.$emit('filter-events', filters)
      },
      // 某一行被點擊
      handleRowClick (row) {
        this.$emit('click-events', row)
      }
    }
  }
</script>

在模板中引用:

<template>
    <compTable
      :tableHeader="tableHeader"
      :tableData="tableData"
      @sort-events="handleSort"
      @filter-events="filterHandler"
      @click-events="handleClick"
    />
</template>

<script>
import compTable from '@/components/compTable'
export default {
    components: { compTable },
    data () {
        return {
       // 數據結構
       tableData: [], // 爲請求到的table數據 tableHeader: [ // 表頭信息,可根據minWidth修改寬度      { prop:
'uid', label: '訂單號', minWidth: '160px' }, { prop: 'peopleNumber', label: '人數', sortable: 'custom', minWidth: '75px' }, { prop: 'source', label: '來源', filters: sourceData, columnKey: 'sourceList', minWidth: '90px', render: (h, params) => {return h('span',params.row.source) } } } } } </script>
相關文章
相關標籤/搜索