深入理解element-plus table二次封装:从理论到实践的全面指南

前言

在许多中后台管理系统中,表格占据着半壁江山,如果使用element plus组件库,那么少不了要用到table组件,可是table组件的功能过于基础,因此,我在table组件的实现基础之上进一步封装,从而实现功能更强大的table组件。

在实现table组件的功能之前,我们首先需要先来看看用法,由于使用示例比较多,可能将会有几篇文章主要介绍所有示例用法,介绍完示例之后将会有专门的文章基于使用方式去详细讲解封装思路。

毕竟我们要实现一个东西,就应该需要先理解这个东西怎么用的,从如何使用再去推导如何实现就会很有思路了。

所以在实现之前,我们需要先来具体了解一下每个示例的用法和效果。

首先这个组件被我封装成以插件的形式来使用,我们可以看到在main.ts下的使用代码如下所示:

import { createApp } from 'vue'
import App from './App.vue'
//...
import ElementTable from './components/index'const app = createApp(App);
//....
app.use(ElementTable);
app.mount('#app')

如此一来,我们就可以全局使用该组件了。

示例1-基础使用

组件支持传入column和data属性,即表格列数据和表体数据,前面我们已经说过了,我们是在全局当中注册好了,因此在vue文件当中可以直接使用。示例代码如下:

 <element-table :column="column" :data="tableData" />

然后就是ts代码,如下所示:

import { ElTableColumnProps } from '../components/tableProps';
/* 引入ElTableColumnProps定义column可获得类型提示 */
const column: ElTableColumnProps[] = [{type: "index",width: "60px",label: "序号",},{prop: "name",label: "名字",},{prop: "date",label: "日期",},{prop: "address",label: "地址",},
];
// 后续如无特殊说明,表体数据都是这个
const tableData = [{date: "2016-05-02",name: "佘太君",address: "上海市普陀区金沙江路 1518 弄",},{date: "2016-05-04",name: "王小虎",address: "上海市普陀区金沙江路 1517 弄",},{date: "2016-05-01",name: "王小帅",address: "上海市普陀区金沙江路 1519 弄",},{date: "2016-05-03",name: "王小呆",address: "上海市普陀区金沙江路 1516 弄",},
];

从这个示例,我们可以看到,我们的column传入一个对象数组,对象的属性包含prop,label,type,width等属性,其中type值为index,代表制定一个索引列,然后label和prop分别指定列名以及对应绑定的表体数据字段名,width则指定列宽。

上述代码展示效果如下所示:

在这里插入图片描述

示例2–基础的render table

render渲染函数html部分和前面示例1保持一致,唯一不同的是ts代码,我们只需要绑定column和data属性数据即可,一个示例代码如下所示:

import { h } from 'vue';
// 这里是导入的类型
import { ElTableColumnProps } from '../components/tableProps';
const column: ElTableColumnProps[] = [{type: "index",width: "60px",label: "序号",},{label: "名字",prop: "name",render: (data, scope) => {const { row, column } = scope;const propKey = column.property;return h('div', null, { default: () => `render 结果 -- ${row[propKey]}== ${data}` })},},{prop: "date",label: "日期",},{prop: "address",label: "地址",},
];

上述代码展示效果如下所示:

在这里插入图片描述

从这个示例,我们可以看到,render是一个渲染函数,代表自定义渲染列。

这里尤其需要注意render函数的参数,第一个参数指的是数据,第二个参数则指的是当前表格上下文,我们可以从中获取一些属性,例如列数据column,行数据row等等,从而实现自定义渲染表体。

示例3–插槽用法

关于使用插槽,我们通常使用一个template标签,并制定#加属性值来表示,如示例:

 <element-table :column="column" :data="tableData"><template #name="{ row }"><div><span><code>name</code>插槽--{{ row.name }}</span></div></template><template #default><div><span>默认插槽名字为<strong>default</strong></span></div></template></element-table>

这里分成了两种插槽,第一种是具名插槽,通过#[属性名(这里的属性名通过column里的slotName属性指定)]指定,第二种则是默认插槽,通过#default(与前面具名插槽原理类似)指定,然后在配置的column列数据中,我们通过slotName来指定插槽名,代码如下所示:

const column = [{type: "index",width: "60px",label: "序号",},{label: "具名插槽",slotName: "name",},{label: "默认插槽",slotName: "default",},{prop: "date",label: "日期",},{prop: "address",label: "地址",},
];

上述代码展示效果如下所示:

在这里插入图片描述

示例4–边框

边框table,只是在组件当中传入一个border属性即可,其它跟前面示例没什么两样。代码如下所示:

<element-table border :column="column" :data="tableData" />

ts代码忽略,以上代码展示效果如下图所示:

在这里插入图片描述

示例5–自定义列渲染

在前面的示例3当中,我们已经初窥自定义列渲染的实现了,接下来这个示例,我们将基于示例3,实现更为复杂的自定义渲染列示例。我们将会引入element-plus的icon(图标)组件和popover(悬浮对话框)组件。代码如下所示:

  <element-table :column="column" :data="tableData" style="width: 100%"><template #date="scope"><div style="display: flex; align-items: center"><el-icon><timer /></el-icon><span style="margin-left: 10px">{{ scope.row.date }}</span></div></template><template #name="scope"><el-popover effect="light" trigger="hover" placement="top" width="auto"><template #default><div>name: {{ scope.row.name }}</div><div>address: {{ scope.row.address }}</div></template><template #reference><el-tag>{{ scope.row.name }}</el-tag></template></el-popover></template><template #default="scope"><el-button size="small" @click="handleEdit(scope.$index, scope.row)">Edit</el-button><el-button size="small" type="danger" @click="handleDelete(scope.$index, scope.row)">Delete</el-button></template></element-table>

接下来,来看我们的ts代码,如下所示:

import { Timer } from "@element-plus/icons-vue";interface User {date: string;name: string;address: string;
}const handleEdit = (index: number, row: User) => {console.log(index, row);
};
const handleDelete = (index: number, row: User) => {console.log(index, row);
};const column = [{type: "index",width: "60px",label: "序号",},{prop: "date",label: "日期",width: 180,slotName: "date",},{prop: "name",width: 180,label: "名字",slotName: "name",},{prop: "address",label: "Operations",slotName: "default",},
];const tableData: User[] = [//...
];

这个示例其实也还是插槽的用法,只不过多了绑定按钮事件。上述代码展示效果如下所示:

在这里插入图片描述

示例6-自定义表头

自定义表头与自定义列渲染是同一个原理,也是插槽用法,只不过自定义列的插槽名属性叫做slotName,而自定义表头的插槽名则叫做headerSlot,然后就可以像自定义列那样自定义表头即可。如以下一个示例:

 <element-table :column="column" :data="filterTableData" style="width: 100%"><template #header><el-input v-model="search" size="small" placeholder="Type to search" /></template><template #default="scope"><el-button size="small" @click="handleEdit(scope.$index, scope.row)">Edit</el-button><el-button size="small" type="danger" @click="handleDelete(scope.$index, scope.row)">Delete</el-button></template></element-table>

然后我们的ts代码就可以基于搜索框,实现数据的过滤,利用ref函数创建一个响应式数据,也就是search。代码如下所示:

import { ref, computed } from "vue";interface User {date: string;name: string;address: string;
}const search = ref("");
//...注意这里
const filterTableData = computed(() =>tableData.filter((data) =>!search.value || data.name.toLowerCase().includes(search.value.toLowerCase()))
);const handleEdit = (index: number, row: User) => {console.log(index, row);
};
const handleDelete = (index: number, row: User) => {console.log(index, row);
};const column = [{prop: "date",label: "日期",width: 180,slotName: "date",},{prop: "name",width: 180,label: "名字",slotName: "name",},{align: "right",slotName: "default",//这里就是自定义表头的自定义插槽名headerSlot: "header",},
];const tableData: User[] = [//...
];

以上代码展示效果如下图所示:

在这里插入图片描述

输入搜索值之后,展示效果如下图所示:

在这里插入图片描述

示例7–自定义索引值

自定义索引值示例很简单,只需要配置列的index属性值为一个函数即可,代码如下:

const indexMethod = (index: number) => index * 2;
const column = [{type: "index",//主要是这里index: indexMethod,},//...
];
const tableData = [// ...
]

其余的没什么变化,html代码也很简单,如下所示:

<element-table :column="column" :data="tableData" style="width: 100%"></element-table>

以上代码展示效果如下图所示:

在这里插入图片描述

项目附件:点此下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/292222.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外贸独立站seo优化方案

对于外贸独立站而言&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;是吸引潜在客户、提升品牌曝光度和增加销售量的关键之一。但是&#xff0c;由于竞争激烈和市场的多样性&#xff0c;要想在搜索引擎上取得好的排名并非易事。本文将介绍一些外贸独立站SEO的有效方法&…

Kotlin 中的类和构造方法

Kotlin 中的类与接口和 Java 中的类与接口还是有区别的。例如&#xff0c;Koltin 中的接口可以包含属性声明&#xff0c;与 Java 不同的是。Kotlin 的声明默认是 final 和 public 的。此外&#xff0c;嵌套的类默认并不是内部类&#xff1a;它们并没有包含对其它外部类的隐式引…

QA:ubuntu22.04.4桌面版虚拟机鼠标丢失的解决方法

前言 在Windows11中的VMWare Workstation17.5.1 Pro上安装了Ubuntu22.04.4&#xff0c;在使用过程中发现&#xff0c;VM虚拟机的鼠标的光标会突然消失&#xff0c;但鼠标其他正常&#xff0c;就是光标不见了&#xff0c;下面是解决办法。 内容 如下图&#xff0c;输入mouse&a…

测试图片可否直接粘贴进csdn,后期删除

java图书管理系统mysqlswing版本 V1.0.1版 P1&#xff0c;简介项目功能&#xff1a; 运行主函数运行程序&#xff0c;进入管 理系统的登录界面

Kubeflow文档1:介绍与架构

Kubeflow 2024/3/19版本的文档 此专栏用来展示相关的内容翻译&#xff0c;重点关注本地部署&#xff0c;关于运营商的方案&#xff0c;请自行查阅 文档地址https://www.kubeflow.org/docs/ 开始编辑时间&#xff1a;2024/3/27&#xff1b;最后编辑时间2024/3/27 Kubeflow文…

使用1panel部署Ollama WebUI(dcoekr版)浅谈

文章目录 说明配置镜像加速Ollama WebUI容器部署Ollama WebUI使用问题解决&#xff1a;访问页面空白 说明 1Panel简化了docker的部署&#xff0c;提供了可视化的操作&#xff0c;但是我在尝试创建Ollama WebUI容器时&#xff0c;遇到了从github拉取镜像网速很慢的问题&#xf…

企微获客助手到底有哪些价值?

获客助手作为企业微信官方提供的获客工具&#xff0c;在私域布局中确实展现了其强大的引流效率和便利性。这一工具通过简化传统引流过程中的复杂步骤&#xff0c;使得企业能够更高效地吸引和转化潜在客户。此外&#xff0c;获客助手还能实现不同渠道的无缝链接&#xff0c;进一…

linux文件系统:VFS

文章目录 vfs1 super_block2 dentry2.1 dentry树2.2 dentry的cache2.3 挂载 3 inode4 文件file5 vfs各结构体的关系 vfs Linux内核通过虚拟文件系统&#xff08;Virtual File System&#xff0c;VFS&#xff09;管理文件系统 VFS为所有的文件系统提供了统一的接口&#xff0c…

HAProxy + Vitess负载均衡

一、环境搭建 Vitess环境搭建&#xff1a; 具体vitess安装不再赘述&#xff0c;主要是需要启动3个vtgate&#xff08;官方推荐vtgate和vtablet数量一致&#xff09; 操作&#xff1a; 在vitess/examples/common/scripts目录中&#xff0c;修改vtgate-up.sh文件&#xff0c;…

【GitLab】Ubuntu 22.04 快速安装 GitLab

在 Ubuntu 22.04 上安装最新版本的 GitLab&#xff0c;可以按照以下步骤操作&#xff1a; 1. 更新系统&#xff1a; 在终端中执行以下命令以确保系统是最新的&#xff1a; sudo apt update sudo apt upgrade2. 安装依赖&#xff1a; 安装 GitLab 所需的依赖包&#xff1a; …

vue2.0脚手架搭建

vue起步 文档 https://v2.cn.vuejs.org/ {{}} 变量、表达式渲染v-html html模板&#xff0c;渲染htmlv-model 绑定值&#xff08;双向绑定&#xff09;v-if 判断v-bind&#xff1a;href"地址" 简写&#xff1a;绑定属性 简写&#xff1a;href&#xff1a;"&qu…

SQL109 纠错4(组合查询,order by..)

SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state MI UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IL ORDER BY cust_name;order by子句&#xff0c;必须位于最后一条select语句之后

Android vehicle车辆属性新增demo

目录 前言一、Vehicle模块1.1 简介1.2 Vehicle框架1.3 主要功能和特点1.4 重要服务CarService1.4.1 简介1.4.2 组成1.4.3 启动时序1.4.4 作用 二、车辆属性新增demo2.1 CarPropertyService2.1.1 简介2.1.2 架构2.1.3 车辆属性 API2.1.4 CarPropertyService 初始化流程 2.2 App …

上岸美团了!

Hello&#xff0c;大家好&#xff0c;最近春招正在如火如荼&#xff0c;给大家分享一份美团的面经&#xff0c;作者是一份某双非的硕&#xff08;只如初见668&#xff09;&#xff0c;刚刚通过了美团的3轮面试&#xff0c;已经拿到offer&#xff0c;以下是他的一些分享。 一面&…

Rust编程(四)PackageCrateModule

这一部分的中文教程/文档都很混乱,翻译也五花八门,所以我建议直接看英文官方文档,对于一些名词不要进行翻译,翻译只会让事情更混乱,本篇从实战和实际需求出发,讲解几个名称的关系。 Module & Crate & Package & Workspace 英文中的意思: Cargo:货物 Crate:…

遥感数字图像处理的学习笔记

相关链接&#xff1a; 遥感数字图像处理实验教程&#xff08;韦玉春&#xff09;--部分实验问题回答 目录 1.什么是图像&#xff0c;什么是数字图像&#xff1f; 2.什么是遥感数字图像&#xff1f;模拟图像(照片)与遥感数字图像有什么区别&#xff1f; 3.什么是遥感数字图像…

java数组与集合框架(一) -- 数据结构,数组

数据结构 概述 为什么要讲数据结构&#xff1f; 任何一个有志于从事IT领域的人员来说&#xff0c;数据结构&#xff08;Data Structure&#xff09;是一门和计算机硬件与软件都密切相关的学科&#xff0c;它的研究重点是在计算机的程序设计领域中探讨如何在计算机中组织和存储…

【公示】2023年度青岛市级科技企业孵化器拟认定名单

根据《青岛市科技企业孵化器管理办法》&#xff08;青科规〔2023〕1号&#xff09;&#xff08;以下简称《管理办法》&#xff09;、《关于开展2023年度市级科技企业孵化器认定申报工作的通知》&#xff0c;经申报受理、区市推荐、形式审查、专家评审及现场核查等程序&#xff…

鸿蒙开发(七)-UIAbility启动模式

鸿蒙开发(七)-启动模式 根据代码中定义,UIAbility的启动模式有以下几种&#xff1a; "launchType": {"description": "Indicates the boot mode of ability.","type": "string","enum": ["standard",…

【数据结构与算法篇】动态顺序表及相关OJ算法题

【数据结构与算法篇】动态顺序表及相关OJ算法题 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; 目录 【数据结构与算法篇】动态顺序表及相关OJ算法题 1. 动态顺序表的实现 1.1 SeqList.h 头文件声明 1.…