element ui Table二次封裝

element ui Table 二次封裝

表格的分頁

  • 在利用element ui Table編寫項目時,會存在表格展示的數(shù)據(jù)存在分頁的情況
    • 普遍的做法
     // 利用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>
    
    每次編寫都需要寫那么多的標簽與方法等,何不再進行封裝雄嚣,只需編寫一個標簽就完成Table表格與分頁的展示呢
    • 封裝后
     // 新建我們的組件文件如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>
    
    • 在需要使用的頁面使用
     <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ù)后臺接口數(shù)據(jù)返回
         }
       }
       computed:{
         columns(){ // 表頭信息
           /**
            * 表頭信息為什么寫在computed里面
            * 由于我最近所的項目是基于i18n國際化的
            * 如果寫在data里面,不能根據(jù)i18n的語言切換實時進行切換
            **/ 
           return [
             {lable:'標題1',prop:'title1'},
             {lable:'標題2',prop:'title2'},
             {lable:'標題3',prop:'title3'},
           ]
         }
       }
     }
     </script>
    
    這樣我們就實現(xiàn)了簡單的table表格封裝肄渗,在需要使用的地方直接引入我們封裝好的組件傳入對應對應的參數(shù)就能實現(xiàn)表格的展示與分頁和選擇框的展示了。

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

  • 上面我們已經(jīng)實現(xiàn)了簡單的'element ui Table'封裝咬最,但是還是不能實現(xiàn)一些復雜的表格展示翎嫡,如圖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: { // 總頁數(shù)
      type: Number,
      default: 1
    },
    totalPage: { // 總條數(shù)
      type: Number,
      default: 1
    },
    currentPage: { // 當前頁
      type: Number,
      default: 1
    },
    pageSize: { // 每頁顯示條數(shù)
      type: Number,
      default: 10
    },
    maxHeight: { // 最大高度
      type: String,
      default: ''
    },
    hasPageTotal: { // 是否顯示分頁
      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) { // 選中項
      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(`當前頁: ${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ù)后臺接口獲得
          pageData: {}, // 頁碼對象
          pageIndex: 1
        }
      },
      computed: {
        columns() { // 表頭配置對象
          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() { // 操作按鈕配置對象
          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)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市永乌,隨后出現(xiàn)的幾起案子惑申,更是在濱河造成了極大的恐慌,老刑警劉巖翅雏,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圈驼,死亡現(xiàn)場離奇詭異,居然都是意外死亡望几,警方通過查閱死者的電腦和手機绩脆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橄抹,“玉大人靴迫,你說我怎么就攤上這事÷ナ模” “怎么了玉锌?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疟羹。 經(jīng)常有香客問我主守,道長,這世上最難降的妖魔是什么榄融? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任参淫,我火速辦了婚禮,結(jié)果婚禮上愧杯,老公的妹妹穿的比我還像新娘黄刚。我一直安慰自己,他們只是感情好民效,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布憔维。 她就那樣靜靜地躺著,像睡著了一般畏邢。 火紅的嫁衣襯著肌膚如雪业扒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天舒萎,我揣著相機與錄音程储,去河邊找鬼。 笑死臂寝,一個胖子當著我的面吹牛章鲤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咆贬,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼败徊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了掏缎?” 一聲冷哼從身側(cè)響起皱蹦,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眷蜈,沒想到半個月后沪哺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡酌儒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年辜妓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忌怎。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡籍滴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呆躲,到底是詐尸還是另有隱情异逐,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布插掂,位于F島的核電站灰瞻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辅甥。R本人自食惡果不足惜酝润,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望璃弄。 院中可真熱鬧要销,春花似錦、人聲如沸夏块。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浑塞,卻和暖如春借跪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酌壕。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工掏愁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卵牍。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓果港,卻偏偏與公主長得像,于是被迫代替她去往敵國和親糊昙。 傳聞我的和親對象是個殘疾皇子辛掠,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容