Element使用el-table组件二次封装

接下来我将为您详细讲解Element使用el-table组件二次封装的完整攻略。

什么是el-table组件

el-table 是一个使用 vue.js 2.0element-ui 组件库构建的高效、灵活的表格组件,可以满足大部分的表格展示需求。使用 el-table 可以更加方便地展示表格数据,并提供排序、分页、搜索和自定义模板等增强功能。

为什么要二次封装el-table

虽然 el-table 自带的功能已经很强大了,但是在实际开发中,我们可能会遇到需要进行更多的扩展和定制的情况。因此,我们可以通过二次封装 el-table 组件,来满足特定的项目需求。

el-table组件二次封装的步骤

1. 创建封装组件

首先,我们需要新建一个封装组件,该组件可以根据传入的数据,来生成具有特定功能的表格。在 Vue 组件中,我们可以使用以下代码创建一个基本的 el-table

<template>
  <el-table
    :data="tableData"
    stripe
    border
  >
    <!-- 表格头部 -->
    <el-table-column
      v-for="column in columns"
      :key="column.prop"
      :prop="column.prop"
      :label="column.label"
      :width="column.width"
    ></el-table-column>
  </el-table>
</template>

<script>
export default {
  props: {
    columns: {
      type: Array,
      required: true,
    },
    tableData: {
      type: Array,
      required: true,
    },
  },
}
</script>

在这个组件中,我们使用了 el-tableel-table-column 组件来实现表格的基本展示。由于我们希望这个组件更加灵活和易用,所以我们通过 props 将表格需要的列 columns 和数据 tableData 传入,然后通过 v-for 循环创建表格列。

2. 自定义表格样式

根据需要,我们可以对表格的样式进行自定义。例如,可以通过 CSS 修改表头的背景色、行高等。示例如下:

.el-table__header-wrapper {
  background-color: #f5f7fa;
  font-weight: bold;
}

.el-table__row {
  height: 60px;
}

3. 实现表格排序

如果我们希望对表格数据进行排序,需要添加 sort-bysort 属性,然后在 methods 中定义排序函数。示例如下:

<el-table-column
  v-for="column in columns"
  :key="column.prop"
  :prop="column.prop"
  :label="column.label"
  :width="column.width"
  :sort-by="column.prop"
  :sort-method="sortData"
>
</el-table-column>

<script>
export default {
  methods: {
    sortData(column, prop, order) {
      this.tableData = this.tableData.sort((a, b) => {
        if (order === "ascending") {
          return a[prop] - b[prop];
        } else {
          return b[prop] - a[prop];
        }
      });
    },
  },
}
</script>

在这里,我们将每列的 prop 值作为 sort-by 的参数,将排序的方法定义在 methods 中,然后在表格列的 sort-method 属性中使用定义的函数。

4. 实现表格自定义模板

通过自定义表格列模板,我们可以更加灵活地展示表格数据,例如可以将一列数据展示为进度条或者操作按钮。以下是一个自定义模板的示例:

<el-table-column label="操作">
  <template slot-scope="scope">
    <el-button type="primary" size="mini" @click="handleEdit(scope.row)">
      编辑
    </el-button>
    <el-button type="danger" size="mini" @click="handleDelete(scope.row)">
      删除
    </el-button>
  </template>
</el-table-column>

在这个示例中,将表格列 label 设置为 “操作”,然后在 slot-scope 中定义了一个方法 handleEdit(scope.row) 用于编辑操作,并绑定到 el-button 上。

示例演示

下面通过两个示例演示如何二次封装 el-table 组件:

示例1:可过滤搜索的表格

我们可以在 el-table 组件基础上,添加一个搜索框,通过搜索框的输入,来实现对表格数据的过滤搜索。以下是一个简单的示例:

<template>
  <div>
    <el-input
      v-model.trim="search"
      placeholder="请输入关键字"
      clearable
    />
    <my-table :columns="columns" :table-data="tableData" />
  </div>
</template>

<script>
import MyTable from "./MyTable.vue";

export default {
  components: {
    MyTable,
  },
  data() {
    return {
      search: "",
      columns: [
        {
          label: "序号",
          prop: "id",
          width: "80",
        },
        {
          label: "标题",
          prop: "title",
        },
        {
          label: "发布日期",
          prop: "date",
          width: "200",
        },
      ],
      tableData: [
        {
          id: 1,
          title: "技术文档",
          date: "2022-01-01",
        },
        {
          id: 2,
          title: "产品说明书",
          date: "2022-02-01",
        },
        {
          id: 3,
          title: "开发计划表",
          date: "2022-03-01",
        },
      ],
    };
  },
  computed: {
    filteredData() {
      if (this.search) {
        return this.tableData.filter((item) => {
          return (
            item.title.toLowerCase().indexOf(this.search.toLowerCase()) !== -1
          );
        });
      } else {
        return this.tableData;
      }
    },
  },
};
</script>

在这个示例中,我们通过引入并使用 MyTable 组件,在组件中定义了搜索框和表格数据。然后通过计算属性 filteredData,将搜索框的内容和表格数据进行比较,实现数据过滤操作。

示例2:含有操作按钮的表格

在这个示例中,我们可以在 el-table 组件中添加一列操作按钮,用于表格数据的编辑和删除操作。以下是示例代码:

<template>
  <my-table :columns="columns" :table-data="tableData" />
</template>

<script>
import MyTable from "./MyTable.vue";
import { MessageBox } from "element-ui";

export default {
  components: {
    MyTable,
  },
  data() {
    return {
      columns: [
        {
          label: "序号",
          prop: "id",
          width: "50",
        },
        {
          label: "名称",
          prop: "name",
          width: "150",
        },
        {
          label: "性别",
          prop: "sex",
          width: "80",
        },
        {
          label: "年龄",
          prop: "age",
          width: "80",
        },
        {
          label: "操作",
          width: "150",
        },
      ],
      tableData: [
        {
          id: 1,
          name: "小王",
          sex: "男",
          age: 20,
        },
        {
          id: 2,
          name: "小李",
          sex: "女",
          age: 25,
        },
        {
          id: 3,
          name: "小张",
          sex: "男",
          age: 30,
        },
      ],
    };
  },
  methods: {
    handleEdit(row) {
      // todo
    },
    handleDelete(row) {
      MessageBox.confirm("确定删除吗?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      }).then(() => {
        const index = this.tableData.findIndex((item) => item.id === row.id);
        this.tableData.splice(index, 1);
      });
    },
  },
  computed: {
    tableDataWithBtn() {
      return this.tableData.map((item) => {
        return {
          ...item,
          operator: [
            {
              label: "编辑",
              size: "mini",
              type: "primary",
              click: this.handleEdit.bind(this, item),
            },
            {
              label: "删除",
              size: "mini",
              type: "danger",
              click: this.handleDelete.bind(this, item),
            },
          ],
        };
      });
    },
  },
};
</script>

在这个示例中,我们过多使用 computed 计算属性来添加 operator 列,并在这列中定义编辑和删除操作按钮的样式和点击事件方法 handleEdithandleDelete 。同时,在 handleDelete 方法中,调用弹窗插件 MessageBox 来进行删除操作的确认提示。

至此,我们已经完成了 el-table 组件的二次封装,可以更加方便的使用 el-table 这一强大的组件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Element使用el-table组件二次封装 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 微软开始在 Win11 上测试 Win10 经典右键菜单的新型设计,更加干净整洁

    下面是关于“微软开始在 Win11 上测试 Win10 经典右键菜单的新型设计,更加干净整洁”的详细讲解攻略。 什么是 Win10 经典右键菜单? Win10 经典右键菜单是指现在 Win10 操作系统上默认显示的鼠标右键菜单,它包含了大量的子菜单和选项,界面看上去比较复杂,而且并不是每个选项都是用户常用的。所以有一些用户可能会希望有一种更加简洁、整洁的右键…

    other 2023年6月27日
    00
  • msixbundle怎么打开?win10后缀.MSIX安装包怎么安装使用?

    MSIXBundle的打开和安装使用攻略 MSIXBundle是一种用于打包和分发Windows应用程序的文件格式。它可以包含一个或多个MSIX安装包,以及其他相关资源。下面是详细的攻略,教你如何打开和安装使用MSIXBundle文件。 打开MSIXBundle文件 要打开MSIXBundle文件,按照以下步骤进行操作: 首先,确保你的计算机上已经安装了Wi…

    other 2023年8月5日
    00
  • 终于实现samba可写不可删除

    Samba是一种开源软件,它提供了一种在Linux和Windows之间共享文件和打印机的方法。在Samba中,我们可以设置共享文件夹的权限,包括可读、可写、可删除等。本文将介绍如何实现Samba可写不可删除的完整攻略,包括Samba的基本概念、配置文件的修改、权限设置等内容。同时,本文还将提供两个示例说明,以帮读者更好地理解Samba的使用方法。 1. Sa…

    other 2023年5月5日
    00
  • 浅谈java IO流——四大抽象类

    介绍Java IO流前,先来明确一下IO流的概念。IO(Input/Output)即输入/输出操作,是计算机应用程序与外部世界(用户、文件)进行交互的重要手段。Java IO流是Java程序中用于读写数据的一种机制,Java为此提供了一系列的API以便于开发者使用。 Java IO流分为两种:字节流和字符流。字节流操作所有类型的文件(如音频、视频、图片等),…

    other 2023年6月27日
    00
  • MySQL中存储的数据查询的时候如何区分大小写

    在MySQL中,查询时如何区分大小写,主要取决于以下几点: 表的字符集:MySQL可设置多种字符集,包括字母大小写不敏感(如:UTF8_GENERAL_CI)和字母大小写敏感(如:UTF8_BIN)两种,常用的是utf8mb4字符集,其中utf8mb4_general_ci是字母大小写不敏感的,utf8mb4_bin是大小写敏感的; 字段的字符集:如果某个字…

    other 2023年6月27日
    00
  • windows下使用cwRsync定期备份网站(服务器文件同步)

    Windows下使用cwRsync定期备份网站(服务器文件同步)攻略 概述 本文将详细介绍在Windows环境下使用cwRsync进行网站文件备份的具体操作步骤。cwRsync是为Windows平台开发的Rsync软件,它提供了类Unix操作系统中的rsync命令,可用于文件同步、数据备份等场景。在本文中,我们将利用cwRsync的特性,实现定期备份网站文件…

    other 2023年6月27日
    00
  • jquery、js调用iframe父窗口与子窗口元素的方法整理

    下面是关于”jquery、js调用iframe父窗口与子窗口元素的方法整理”的详细讲解。 什么是 iframe iframe,全称为内联框架(Inline Frame),是一种在 HTML 文档中嵌入另一个 HTML 文档的标记。它之所以常用,是因为它可以让某些网页元素拥有独立的滚动条,而且可以避免网站的 CSS 样式污染,同时能够在用户浏览一个网页时加载并…

    other 2023年6月26日
    00
  • 什么是数据库

    数据库是一组按照特定方式存储数据的数据集合,可以通过计算机程序进行访问、管理和更新。常见数据库类型包括关系型数据库、非关系型数据库以及图形数据库等。 数据库的基本概念 数据:指记录在数据库中的信息,可以是实体、属性和关系等。 数据库管理系统(DBMS):是指用于管理和操作数据库的软件系统,如MySQL、Oracle等。 数据库模型:是一种描述数据库结构、定义…

    其他 2023年4月16日
    00
合作推广
合作推广
分享本页
返回顶部