vue el-table 分页表格的封装(简单版本)

vue el-table 分页表格的封装(简单版本)

前言

分页表格在我们的后台管理系统中经常用到,element框架的表格几乎可以说满足大部分的功能需求,实现起来也比较方便,扩展性也比较强。但是在实际开发中,有需要到分页表格的页面都还是得复制粘贴 改改,还是比较不方便开发

设计思路

设计的思路是参考layui表格的,layui分页表格使用起来很方便,分页的逻辑不用自己去写,后台返回的数据只要根据他的要求来就可以,不符合要求也能自己修改 layui表格地址
我们只需要根据自己业务需要写对应的js就可以了

具体代码
封装的组件

element表格地址

封装思路

接收一个tableData对象的数据
reqUrl: 表示请求数据的地址
operaData: 是行内操作按钮的数据
columnData: 是表格需要显示的哪些字段数据

  tableData: {
      reqUrl: "https://easy-mock.com/mock/5f2403effa76424e9506a6b8/example/getData",
      operaData: {
          isShow: true,
          data: [
            { label: "删除", type: "danger" },
            { label: "增加", type: "primary" },
            { label: "其他", type: "info" }
          ]
        },
        columnData: [
          { prop: "name", label: "名字", width: 200, align: "center" },
          { prop: "time", label: "时间", align: "center" }
        ]
      }
<template>
  <el-card>
    <el-table :data="tableList" style="width: 100%">
      <el-table-column type="index" align="center" label="序号" width="50">
        <template slot-scope="scope">
          <span>{{scope.$index+1+(currentPage-1)*limit}}</span>
        </template>
      </el-table-column>
      <el-table-column
                       v-for="it in tableData.columnData"
                       :key="it.name"
                       :prop="it.prop"
                       :align="it.align"
                       :label="it.label"
                       :width="it.width">
       </el-table-column>
      <!-- 操作 -->
      <el-table-column v-if="tableData.operaData.isShow" fixed="right" label="操作" align="center" :width="tableData.operaData.data.length*80">
        <template slot-scope="scope">
          <el-button
                     v-for="(it,index) in tableData.operaData.data"
                     :key="it.label"
                     :type="it.type"
                     @click="btnClick(scope.row,index)"
                     plain
                     size="small">{{it.label}}
           </el-button>
        </template>
      </el-table-column>
    </el-table>

    <!-- 分页 -->
    <el-pagination
                   style="margin: 40px 0 10px 30px;"
                   background
                   @size-change="pageSizeChange"
                   @current-change="currentChange"
                   :current-page="currentPage"
                   :page-sizes="pageSize"
                   :page-size="limit"
                   layout="total, sizes, prev, pager, next, jumper"
                   :total="total">
     </el-pagination>
  </el-card>
</template>

<script>
import axios from "axios";
export default {
  name: "tables",
  props: {
    tableData: { type: Object, default: () => [] }
  },
  data() {
    return {
      tableList: [],      //表格渲染数据
      currentPage: 1,     //当前页
      pageSize: [5, 10, 20, 50, 100], //页数选择
      total: 0,         //总条数
      limit: 5            //分页数
    };
  },
  mounted() {
    this.getTableData();
  },
  methods: {
    // 获取远程数据
    getTableData() {
      var data = {
        page: this.currentPage,
        limit: this.limit
      };
      axios.post(this.tableData.reqUrl, data).then(res => {
        console.log("请求", res.data);
        if (res.data.code == 1) {
          this.tableList = res.data.data.list;
          this.total = res.data.data.count;
        }

      });
    },
    // 条数选择
    pageSizeChange(val) {
      this.limit = val;
      this.getTableData();
    },
    // 当前页选择
    currentChange(val) {
      this.currentPage = val;
      this.getTableData();
    },
    // 操作按钮
    btnClick(e, idx) {
      this.$emit("click_" + (idx + 1), e)
    }
  }
};
</script>

<style>
</style>
使用分页组件
  1. import 引入组件
  2. components 声明使用组件
  3. 在页面引入组件
  4. 配置对应的数据
<template>
  <div>
    <tables :tableData="tableData" @click_1="test1" @click_2="test2" @click_3="test3"></tables>
  </div>
</template>

<script>
import tables from "../components/tables";
export default {
  data() {
    return {
      tableData: {
        reqUrl: "https://easy-mock.com/mock/5f2403effa76424e9506a6b8/example/getData",
        operaData: {
          isShow: true,
          data: [
            { label: "删除", type: "danger" },
            { label: "增加", type: "primary" },
            { label: "其他", type: "info" }
          ]
        },
        columnData: [
          { prop: "name", label: "名字", width: 200, align: "center" },
          { prop: "time", label: "时间", align: "center" }
        ]
      }
    };
  },
  components: {
    tables //注册table组件
  },
  methods: {
    test1(e) {
      this.$message("删除")
      console.log("删除", e.name);
    },
    test2(e) {
      this.$message("增加");
      console.log("增加", e.name);
    },
    test3(e) {
      this.$message("其他");
      console.log("其他", e.name);
    }
  }
};
</script>

效果图在这里插入图片描述

缺点
  1. 请求没有扩展可以携带自定义参数 ,这个可以自己加在请求url后面 ,或者在组件里面拼接使用
  2. 只适合一些纯数据的展示(下次写个用render可以自己扩展表格显示样式的)
  3. operaData没有做空处理,没有定义这个会报错大家可以自己添加条件判断
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值