element ui Table二次封裝

element ui Table 二次封裝

表格的分頁(yè)

  • 在利用element ui Table編寫(xiě)項(xiàng)目時(shí),會(huì)存在表格展示的數(shù)據(jù)存在分頁(yè)的情況
    • 普遍的做法
     // 利用element ui 的 el-table與el-pagination
     <el-table :data="data">
       <el-table-column type="selection" widht="48"></el-table-column>
       <el-table-column v-for="(item,index) in columns" 
       :key="index"
       :lable="item.lable"
       :prop="item.prop"></el-table>
     </el-table>
     <el-pagination layout="prev, pager, next"
       :total="50"></el-pagination>
    
    每次編寫(xiě)都需要寫(xiě)那么多的標(biāo)簽與方法等,何不再進(jìn)行封裝,只需編寫(xiě)一個(gè)標(biāo)簽就完成Table表格與分頁(yè)的展示呢
    • 封裝后
     // 新建我們的組件文件如MyTable.vue文件
     <template>
       <div class="myTable">
          <el-table :data="tableData">
           <el-table-column v-if="hasSelection" type="selection" widht="48"></el-table-column>
           <el-table-column v-for="(item,index) in columns" 
           :key="index"
           :lable="item.lable"
           :prop="item.prop"></el-table>
         </el-table>
         <el-pagination v-if="hasPagination" layout="prev, pager, next"
           :total="50"></el-pagination>
       </div>
     </template>
     <script>
       export default {
         name:'myTable',
         props:{
           hasSelection:{
             type:Boolean,
             default:false
           },
           hasPagination:{
             type:Boolean,
             default:false
           },
           tableData:{
             type:Object,
             default:()=>{return {}}
           },
           columns:{
             type:Object,
             default:()=>{return {}}
           }
         },
         data(){
           return {}
         },
       }
     </script>
    
    • 在需要使用的頁(yè)面使用
     <template>
       <myTable 
         :hasSelection="hasSelection"
         :hasPagination="hasPagination"
         :tableData="tableData"
         :columns="columns"></myTable>
     </tempalte>
     <script>
     import myTable from '@/components/MyTable'
     export default {
       name:'***',
       components:{myTable}
       data(){
         return {
           hasSelection:true,
           hasPagination:true,
           tableData:{} // tableData根據(jù)后臺(tái)接口數(shù)據(jù)返回
         }
       }
       computed:{
         columns(){ // 表頭信息
           /**
            * 表頭信息為什么寫(xiě)在computed里面
            * 由于我最近所的項(xiàng)目是基于i18n國(guó)際化的
            * 如果寫(xiě)在data里面,不能根據(jù)i18n的語(yǔ)言切換實(shí)時(shí)進(jìn)行切換
            **/ 
           return [
             {lable:'標(biāo)題1',prop:'title1'},
             {lable:'標(biāo)題2',prop:'title2'},
             {lable:'標(biāo)題3',prop:'title3'},
           ]
         }
       }
     }
     </script>
    
    這樣我們就實(shí)現(xiàn)了簡(jiǎn)單的table表格封裝,在需要使用的地方直接引入我們封裝好的組件傳入對(duì)應(yīng)對(duì)應(yīng)的參數(shù)就能實(shí)現(xiàn)表格的展示與分頁(yè)和選擇框的展示了。

列表中單元格的內(nèi)容自定義

  • 上面我們已經(jīng)實(shí)現(xiàn)了簡(jiǎn)單的'element ui Table'封裝,但是還是不能實(shí)現(xiàn)一些復(fù)雜的表格展示,如圖1:
table_test.png
  • 封裝組件
<template>
  <div class="Ab_tbale">
    <el-table
      ref="table"
      element-loading-text="Loading"
      :data="tableData"
      border
      :fit="true"
      tooltip-effect="dark"
      style="width:100%"
      :max-height="maxHeight"
      @selection-change="handlerSelectChange"
      @select="handlerSelect"
      @select-all="handlerSelectAll"
    >
      <el-table-column
        v-if="hasSelect"
        type="selection"
        width="38"
      ><!--------></el-table-column>
      <el-table-column
        v-for="(item,index) in columns"
        :key="index"
        :width="item.width ? item.width : ''"
        :align="item.align"
        :label="item.label"
        :prop="item.param"
        :sortable="item.sortable ? 'custom' : false"
      >
        <template slot-scope="scope">
          <expand-dom v-if="item.render" :column="item" :row="scope.row" :render="item.render" :index="index">
            <!-- {{ item.render(scope.row) }} -->
          </expand-dom>
          <span v-else>{{ scope.row[item.param] }}</span>
        </template>
      </el-table-column>
      <el-table-column
        v-if="tableOption.label"

        :fixed="tableOption.fixed"
        :width="tableOption.width"
        :min-width="tableOption.minWidth"
        :label="tableOption.label"
        align="center"
        class-name="small-padding fixed-width"
      >
        <template slot-scope="scope">
          <template v-for="(item,index) in tableOption.options">
            <el-button
              :key="index"
              :disabled="item.disabled?item.disabled(scope.row):false"
              :type="item.type"
              :size="item.size?item.size:''"
              :icon="item.icon"
              @click="handleButton(item.methods,scope.row,scope.row)"
            >
              {{ item.label }}
            </el-button>
          </template>
        </template>

      </el-table-column>

    </el-table>
    <el-pagination
      v-if="hasPageTotal"
      background
      :current-page="currentPage"
      :page-size="pageSize"
      :page-count="pageCount"
      layout="prev, pager, next"
      :total="totalPage"
      @current-change="handleCurrentChange"
    />
  </div>
</template>
<script>
export default {
  name: 'Table',
  components: {
    expandDom: {
      functional: true,
      props: {
        row: Object,
        render: Function,
        index: Number,
        column: {
          type: Object,
          default: null
        }

      },
      render: (h, ctx) => {
        const params = {
          row: ctx.props.row,
          index: ctx.props.index
        }
        if (ctx.props.column) params.column = ctx.props.column
        return ctx.props.render(h, params)
      }
    }
  },
  props: {
    pageCount: { // 總頁(yè)數(shù)
      type: Number,
      default: 1
    },
    totalPage: { // 總條數(shù)
      type: Number,
      default: 1
    },
    currentPage: { // 當(dāng)前頁(yè)
      type: Number,
      default: 1
    },
    pageSize: { // 每頁(yè)顯示條數(shù)
      type: Number,
      default: 10
    },
    maxHeight: { // 最大高度
      type: String,
      default: ''
    },
    hasPageTotal: { // 是否顯示分頁(yè)
      type: Boolean,
      default: false
    },
    hasSelect: { // 是否有選擇框
      type: Boolean,
      default: false
    },
    tableData: { // table表單Object
      type: Array,
      default: () => {
        return []
      }
    },
    columns: { // table表頭數(shù)據(jù)
      type: Array,
      default: () => {
        return []
      }
    },
    tableOption: { // 操作功能按鈕數(shù)據(jù)
      type: Object,
      default: () => {
        return {}
      }
    }
  },
  data() {
    return {
    }
  },
  created() {
  },
  methods: {
    handlerSelectAll(val) {
      this.$emit('handlerSelectAll', val)
    },
    handlerSelect(value, obj) { // 選中項(xiàng)
      this.$emit('handlerSelect', value)
    },
    handlerSelectChange(value) {
      this.$emit('handlerSelectChange', value)
    },
    handleButton(methods, row, index) { // 按鈕事件
      this.$emit('handleButton', { 'methods': methods, 'row': row, 'index': index })
    },
    handleCurrentChange(val) {
      console.log(`當(dāng)前頁(yè): ${val}`)
      this.$emit('handlePageChange', val)
    }
  }
}
</script>
<style lang="scss">
.Ab_tbale{
  .el-pagination{
    text-align: right;
  }
  th{
    background-color:#f5f5f5;
    font-weight: bold;
  }
  .el-table-column--selection div.cell{
    text-overflow: initial !important;
  }
}
</style>
  • 組件使用
  <template>
     <myTable
        :table-data="tableData"
        :columns="columns"
        :table-option="tableOption"
        :max-height="'600px'"
        :has-select="true"
        :total-page="pageData.total"
        :current-page="pageIndex"
        :page-count="pageData.last"
        :page-size="pageData.limit"
        :has-page-total="true"
        @handleButton="handleButton"
        @handlePageChange="handlePageChange"
      ></myTable>
  </template>
  <script>
    import myTable from '@/components/MyTable'
    import { getOrderList } from '@/api/order'
    export default {
      name:'****',
      components:{myTable},
      data () {
        return {
          tableData: [], // 根據(jù)后臺(tái)接口獲得
          pageData: {}, // 頁(yè)碼對(duì)象
          pageIndex: 1
        }
      },
      computed: {
        columns() { // 表頭配置對(duì)象
          return [
            { label: this.$t('orderManagement.orderNum'), param: 'no', align: 'center', width: '' },
            { label: this.$t('orderManagement.orderTitle'), param: 'title', align: 'center', width: '' },
            { label: this.$t('orderManagement.totalSum'), param: 'totalFee', align: 'center', width: '', render: (h, params) => {
              return h('span', { class: { 'order_status_color_orang': true }}, params.row.dealFee)
            } },
            { label: this.$t('orderManagement.orderType'), param: 'statusLabel', align: 'center', width: '', render: (h, params) => {
              return h('span', {
                class: {
                  'order_status_color_gress': params.row.status === 1,
                  'order_status_color_red': params.row.status === 2 || params.row.status === 4,
                  'order_status_color_orang': params.row.status === 3,
                  'order_status_color_blue': params.row.status === 5
                }
              }, params.row.statusLabel)
            } }
          ]
        },
        tableOption() { // 操作按鈕配置對(duì)象
          return {
            label: this.$t('orderManagement.operation'),
            width: '',
            minWidth: this.minWidth,
            fixed: 'right',
            options: [
              { label: this.$t('default.see'), type: 'default', icon: 'el-icon-view', methods: 'preview', size: 'mini' },
              { label: this.$t('default.payment'), type: 'primary', icon: 'el-icon-shopping-cart-2', methods: 'payment', size: 'mini', disabled: item => {
                if (item.status === 3 || item.status === 4 || item.status === 5) {
                  return true
                } else {
                  return false
                }
              } },
              { label: this.$t('orderManagement.orderClose'), type: 'danger', icon: 'el-icon-error', methods: 'close', size: 'mini', disabled: item => {
                if (item.status < 3) {
                  return false
                } else {
                  return true
                }
              } }
            ]
          }
        }
      },
      mounted(){
        this.getList()
      },
      methods: {
        handlePageChange(pageIndex) {
          var data = {}
          data.page = pageIndex
          getOrderList(data).then(res => {
            if (res.code === 0) {
              this.tableData = res.data.list
              this.pageData = res.data.page
            }
          })
        },
        getList() {
          var data = {}
          data.page = this.pageIndex
          getOrderList(data).then(res => {
            if (res.code === 0) {
              this.tableData = res.data.list
              this.pageData = res.data.page
            }
          })
        },
        handleButton(data) {
          var funType = data.methods
          if (funType === 'close') {
            this.orderClose(data.row.no)
          } else {
            this.showPopDetial(data.methods, data.row.no)
            this.selectOrderItem = data.row
          }
        }
      }
    }
  </script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容