elementUI table二次封装加分页器分享

前言

​ 最近在做自己的项目一个小项目练手的时候,封装了一个前端的table控件,感觉还挺方便的,顺便分享给大家,有写的不好的,可以多多指教,顺便也可以加深一下自己的印象。

封装代码

这里的代码是放在:src/components/HlTable/index.vue

<template>
  <div>
    <div>
      <div>
        <!--这里放按钮-->
        <el-button v-for="item in buttonList" :key="item.click" :type="item.type" :icon="item.icon" style="margin-bottom: 10px" @click="buttonClick(item.click)">{{ item.clickName }}</el-button>
      </div>
      <div>
        <!--这里是table-->
        <el-table v-loading="listLoading" :data="sourceData" border @selection-change="handleSelectionChange" @select="handleSelect" @select-all="handleSelectAll">
          <slot></slot>
        </el-table>
      </div>
    </div>
    <div>
      <!--分页器-->
      <el-pagination
        style="float: right;margin-top:20px"
        :page-size="tablePageSize"
        :page-sizes="[10, 20, 50, 100]"
        :current-page.sync="pageIndex"
        :total="sourceTotal"
        layout="total, sizes, prev, pager, next, jumper"
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
      >
      </el-pagination>
    </div>
  </div>
</template>

<script>
export default {
  name: 'HlTable',
  props: {
    dataUrl: {
      type: String,
      default: ''
    },
    queryForm: {
      type: Object,
      default: null
    },
    buttonList: {
      type: Array,
      default: null
    }
  },
  data() {
    return {
      tablePageSize: 20,
      pageIndex: 1,
      sourceTotal: 0,
      sourceData: [],
      listLoading: false,
      checkboxData: [] // 选中的数据
    }
  },
  created() {
    this.getTable(1, 20)
  },
  methods: {
    // 每页 ${val} 条
    handleSizeChange(val) {
      this.tablePageSize = val
      this.getTable(1, val)
    },
    // 当前页: ${val} 页
    handleCurrentChange(val) {
      this.pageIndex = val
      this.getTable(val, this.tablePageSize)
    },
    /** 当用户手动勾选数据行的 Checkbox 时触发的事件
    * row是当前选中的行,val是选中的行,可能有多行
    * */
    handleSelect(val, row) {
      this.checkboxData = val
    },
    /* 当用户手动勾选全选 Checkbox 时触发的事件	*/
    handleSelectAll(val) {
      this.checkboxData = val
    },
    /* 当选择项发生变化时会触发该事件 */
    handleSelectionChange() {
    },
    // 按钮方法
    buttonClick(click) {
      // 向调用者,“抛出”一个方法
      this.$emit(click, this.checkboxData)
    },
    // 获取表格数据
    getTable(index, size) {
      const param = {
        pageIndex: index || 1,
        pageSize: size || 20
      }
      this.tablePageSize = size || 20
      this.pageIndex = index || 1
      if (this.queryForm) {
        for (const attr in this.queryForm) {
          param[attr] = this.queryForm[attr]
        }
      }
      this.listLoading = true
      this.$http.get(this.dataUrl, param).then(res => {
        if (res) {
          this.sourceData = res.list
          this.sourceTotal = res.total
        }
        this.listLoading = false
      }).catch(errer => {
        this.$message.error(errer.message)
        this.listLoading = false
      })
    }
  }
}
</script>

<style scoped>
</style>

代码解读

props里接受了三个参数

  1. dataUrl: 这是用来填充table表格的数据后端接口地址
  2. queryForm: 用来接受table表格头部的条件
  3. buttonList: table表格上线的按钮,如新增、删除等

methods方法解释

1. getTable(index, size)  方法就是获取table表格的数据方法

调用案例

<template>
  <div class="app-container">
    <el-form :inline="true" :model="queryForm" class="demo-form-inline">
      <el-form-item label="角色名称">
        <el-input v-model="queryForm.roleName" placeholder="角色名称"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="queryData">查询</el-button>
      </el-form-item>
    </el-form>
    <hl-table ref="HlTable" :data-url="dataUrl" :query-form="queryForm">
      <el-table-column type="selection" align="center" width="55"></el-table-column>
      <el-table-column align="center" label="ID" prop="roleId" width="55"></el-table-column>
      <el-table-column label="角色名称" prop="roleName"></el-table-column>
      <el-table-column label="操作" align="center" width="100px">
        <template slot-scope="scope">
          <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
        </template>
      </el-table-column>
    </hl-table>
  </div>
</template>

<script>
import HlTable from '@/components/HlTable/index'
export default {
  name: 'RoleList',
  components: { HlTable },
  data() {
    return {
      dataUrl: '/frontend/api/role/tableList',
      queryForm: {}
    }
  },
  watch: {
  },

  methods: {
    handleEdit(index, item) {
    },
    queryData () {
      this.$refs.HlTable.getTable()
    }
  }
}
</script>

主要是先引入:import HlTable from ‘@/components/HlTable/index’

然后就是可以直接在hl-table里写elementUI里写标签了,至于为什么不把el-table-column也给封装一下,个人感觉没有必要,而且项目在开发的过程中,el-table-column的标签的情况是多样的,有时候可能想需要一些特殊的操作。所以这里我就没有把el-table-column也给封装一下,直接用的是elementUI原生的。

最后的效果图如下:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值