ElementUI对于表格的二次封装

9 篇文章 0 订阅
4 篇文章 0 订阅

前言

最近在做的项目中,有大量界面用到了表格(el-table)组件,但是里面具体显示的内容不同,是从后端获取过来的,如果每一个界面写一下el-table的代码的话,会造成代码量大且不易维护的后果,所以就对el-table表格进行了二次封装。

过程

先看一下最终效果

在这里插入图片描述

代码实现

1.抽出来的子组件的代码:

<template>
  <div>
    <!-- 表格部分 -->
    <el-table :data="tableData" stripe border :default-sort="{prop: 'date', order: 'descending'}">
      <!-- 表格业务内容列 -->
      <template v-for="(item, index) in tableOption">
        <el-table-column
          :key="index"
          :prop="item.prop"
          :label="item.label"
          :align="item.align || 'center'"
          :show-overflow-tooltip="item.overHidden || false"
          :min-width="item.width || '100px'"
          :fixed="item.fixed || true"
          :sortable="item.sortable || false"
          :type="item.type || 'normal'"
        ></el-table-column>
      </template>
      <!-- 表格操作列 -->
      <el-table-column label="操作" v-if="isOperate" min-width="150px">
        <template slot-scope="scope">
          <slot name="operate" :row="scope.row"></slot>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {};
  },
  // 父组件向子组件传值
  props: {
    // 表格显示的数据
    tableData: {
      type: Array,
      default: function() {
        return [];
      }
    },
    // 表格的操作
    tableOption: {
      type: Array,
      default: function() {
        return [];
      }
    },
    // 控制操作列是否显示
    isOperate: {
      type: Boolean,
      default: function() {
        return false;
      }
    }
  },
  methods: {}
};
</script>

<style>
</style>

2.父组件中对子组件的引用

①引入子组件

import commonTable from "../../components/table/common-table";

②注册子组件

components: {
  commonTable
},

③覆用子组件

<common-table :tableData="tableData" :tableOption.sync="tableOption" :isOperate="isOperate">
  <!-- 操作列,填充operate的插槽 -->
  <template slot="operate" slot-scope="scope">
    <!-- 具体要显示的按钮可以在这里自定义 -->
    <el-button type="primary" size="mini">查看</el-button>
  </template>
</common-table>
// 表格数据
tableData: [
  {
    id: 1,
    title: "林业信息拉萨解放了书法家",
    status: "APPROVAL_PENDING",
    docAuthor: "zhangshan",
    submitTime: "2020-06-06 23:58:49"
  },
  {
    id: 2,
    title: "林业信息拉萨解放了书法家",
    status: "DRAFT",
    docAuthor: "zhangshan",
    submitTime: "2020-06-07 00:10:59"
  },
  {
    id: 6,
    title: "林业信息拉萨解放了书法家",
    status: "APPROVAL_PENDING",
    docAuthor: "zhangshan",
    submitTime: "2020-06-11 08:07:26"
  }
],
// 表格操作
tableOption: [
  {
    type: "selection",
    label: "#"
  },
  {
    prop: "title",
    label: "稿件名称",
    overHidden: true
  },
  {
    prop: "status",
    label: "稿件状态",
    sortable: true
  },
  {
    prop: "docAuthor",
    label: "作者"
  },
  {
    prop: "submitTime",
    label: "提交日期",
    sortable: true
  }
],
// 控制操作列是否显示
isOperate: true,

API属性

在这里插入图片描述

小结

对于elementUI表格的二次封装目前封到了这个程度,这样,如果其他界面有需要使用表格的,直接覆用子组件,然后传递表格数据就可以了,代码量会减少一大部分,而且对比起来也易于维护。

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个简单的 Vue 2 和 Element UI 表格二次封装的示例代码: ``` <template> <el-table :data="pageData" :default-sort="{prop: 'id', order: 'ascending'}"> <el-table-column label="ID" prop="id" sortable /> <el-table-column label="姓名" prop="name" /> <el-table-column label="年龄" prop="age" /> <el-table-column label="性别" prop="gender" /> <el-table-column label="操作"> <template slot-scope="scope"> <el-button size="small" @click="handleEdit(scope.row)">编辑</el-button> <el-button size="small" @click="handleDelete(scope.row)">删除</el-button> </template> </el-table-column> <el-pagination :current-page.sync="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="pageSize" :total="tableData.length" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </el-table> </template> <script> export default { props: { tableData: { type: Array, required: true, }, pageSize: { type: Number, default: 10, }, }, data() { return { currentPage: 1, }; }, computed: { pageData() { const start = (this.currentPage - 1) * this.pageSize; const end = start + this.pageSize; return this.tableData.slice(start, end); }, }, methods: { handleEdit(row) { // 编辑操作 console.log('编辑', row); }, handleDelete(row) { // 删除操作 console.log('删除', row); }, handleSizeChange(pageSize) { this.pageSize = pageSize; }, handleCurrentChange(currentPage) { this.currentPage = currentPage; }, }, }; </script> ``` 此示例中,将表格数据和每页显示的数据量通过 props 传入组件。使用计算属性 pageData 计算当前页应该显示的数据。在表格下方添加分页组件,使用 v-model 绑定 currentPage,使用 @size-change 和 @current-change 监听分页组件的事件,调用对应的方法进行相应操作。同时,使用 Element UI 的 el-table-column 组件中的 sortable 属性可以实现列排序。 通过这样的封装,可以使表格组件更加通用、简洁,避免重复的代码编写。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值