基于ElementPlus的分页表格组件ReTable

news2024/11/26 4:44:44

分页表格ReTable

组件实现基于 Vue3 + Element Plus + Typescript,同时引用 vueUse + lodash-es + tailwindCss (不影响功能,可忽略)

基于ElTable和ElPagination组件封装的分页表格,支持本地分页以及远程请求两种方式。本地数据分页自带全量数据的过滤和排序,如果是远程请求则都交给接口返回。

整体功能不会难,单独抽离分页相关计算的hook方法,而ReTable主要解决ElTableColumn的动态渲染和自定义渲染。

组件功能不难,之所以写这一篇是为了写后续的扩展组件:页面级的分页表格组件、可编辑表格组件、带虚拟滚动的可编辑表格组件,均基于这个组件进行的功能扩展。

思路

独立分页相关的hook方法,内置排序、过滤、分页计算等逻辑,返回当前分页数据和分页状态即可。通过ElTable/ElPagination组件实现分页表格,ElTableColumn基于v-for动态渲染

ElTableColumn在满足自身组件属性的情况下,增加了新的字段用于内置自定义渲染,如常见的枚举值渲染标签名,新增 options 配置字段,可以通过默认的枚举值映射自动转换表格单元格的展示,同时自动拍平表头过滤器的格式问题,会自动将 options 转成 filters 配置字段。

分页组件除了支持本地数据分页功能,必然少不了远程请求分页,通过属性控制分页模式,如果是远程请求基本可以跳过本地分页的大部分计算,只需要同步数据和分页状态即可,因此将数据和total总数也开启双向数据绑定(可控),前提是要按照 remote-method 规定的格式设置请求方法。

本地过滤除了列头设置的过滤器条件之外,还要支持外部的过滤条件。

难点

  • 处理本地数据排序:默认按字符顺序
  • 处理本地数据的过滤匹配:区分单选/多选以及解析自定义过滤条件

基础

通过 columns 传入列配置,支持 ElTableColumn 所有属性,同时扩展了 optionslabelKeyvalueKey 用于自动解构枚举值,默认情况下 columnKey会自动赋值为prop,同时 options 也会构造成 filters 生成过滤器选型,如果不想生成过滤器,可以通过指定 filterable=false 取消。

在这里插入图片描述

查看 /demo/table/basic.md

本地过滤

默认情况下如果列配置项带有枚举值数据项 options 会自动根据 labelKeyvalueKey 构造成 filters 字段,当然你也可以手动设置 filters 字段。其他过滤相关可参考 ElTableColumn API说明。

  • filterPlacement 过滤器面板弹出位置
  • filterClassName 过滤器自定义样式类
  • filterMultiple 是否多选过滤,默认true
  • filterMethod 自定义过滤匹配方法,返回true则展示
  • filteredValue 设置过滤器默认选择
    在这里插入图片描述

查看 /demo/table/filter.md

本地排序

列配置配置 sortable 字段开启过滤功能,具体可参考 ElTableColumn API说明。

查看 /demo/table/sort.md

额外参数

除了基于列配置进行过滤,ReTable还支持 customFilters传入自定义过滤配置。

在这里插入图片描述

查看 /demo/table/custom-filter.md

远程请求

通过 remote 属性开启远程请求,默认需要自行监听事件手动调用接口。建议同时配置远程请求方法 remote-method 属性以开启 auto-remote 就可以自动请求。remote-method 可以接收三个参数,参数依次为分页信息{currentPage, pageSize}、过滤器状态、排序状态,过滤器状态、排序状态需要自行解析。

当然你也可以自行监听 sort-changefilter-change 获取当前排序状态和过滤状态。

查看 /demo/table/remote.md

ReTable属性

字段说明类型默认值
pagination是否开启分页booleantrue
rowKey数据项主键名称string“id”
emptyText空状态文本说明string“暂无数据”
columns必填,表格列配置ReTableColumn[]-
data必填,数据集ReTableRow[]-
stripe条纹表格booleanfalse
border是否带边框booleanfalse
reversePageAfterSort是否在排序变更后重置页码booleanfalse
gutter表格间距“default” | “small” | “medium”“default”
customFilters自定义过滤条件ReTableCustomFilter[]-

除了上述属性,ElTable属性也都支持,默认会被ElTable实例继承

ReTable继承CustomPagination属性,其他一些分页请求相关属性参考下面

CustomPagination属性

字段说明类型默认值
pageSize(v-model)页大小number10
currentPage(v-model)当前页码number1
total(v-model)数据总数,remote=true有效,且必须指定number-
paginationPropsElPagination属性Partial<PaginationProps>-
autoRemote自动请求,remote=true有效booleanfalse
firstRemote首次渲染自动请求,remote=true有效booleanfalse
remote是否开启远程请求booleanfalse
remoteMethod远程请求方法({currentPage: number; pageSize: number;}, filters: Record<string, any>, sorts?: Record<string, any>) => Promise<any>-
dataResponsive是否开启数据响应,remote=true有效,total、data支持v-model双向绑定booleanfalse
resetCurrentPage数据变更是否重置页码booleantrue

ReTableColumn字段

字段说明类型默认值
options字段关联枚举值数据,默认会构造filters字段,以及自动转成labelKey展示Array<{[labelKey]: string, [valueKey]: any}>-
labelKey枚举值标签名字段string-
valueKey枚举值键值字段string-
slot列内容作用域插槽名string-
headerSlot列表头作用域插槽名string-
filterIconSlot列表头自定义过滤器图标插槽名string-
filterable是否开启过滤,设置false会取消options转filters的默认行为booleantrue
renderCell自定义单元格渲染(data: { row: any; column: any; $index: number }) => VNode-

支持所有ElTableColumn属性,具体查看Element Plus ElTableColumn API

ReTable事件

事件名说明格式
sort-change表单控件字段值发生变化时触发(data: ReTableSortColumn) => void
filter-change表单数据更新后触发(newFilters: ReTableFilterColumn) => void
update:pageSize页大小改变时触发(pageSize: number) => void
update:currentPage页码改变时触发(currentPage: number) => void
update:total数据总数更新时触发,只有定义 dataResponsive 属性时有效(total: number) => void
update:modelValue数据集更新时触发,只有定义 dataResponsive 属性时有效(value: Record<string, any>[]) => void

除了上述事件,ElTable事件也都支持,默认会被ElTable实例继承

ReTable插槽

插槽名说明
empty空状态展示
appendElTable append插槽
[headerSlot]每个表单配置项都支持表头插槽,通过headerSlot指定
[filterIconSlot]每个表单配置项都支持表头过滤器图标插槽,通过filterIconSlot指定
[slot]每个表单配置项都支持内容作用域插槽,通过slot指定

[headerSlot]、[filterIconSlot]、[slot]插槽名有列配置决定

ReTable Expose

字段说明类型
tableRefElTable组件实例InstanceType<typeof ElTable>
pagerRefElPagination组件示例InstanceType<typeof ElPagination>
toRemote远程请求方法() => void
loading加载状态Ref<boolean>
currentPage当前页码Ref<number>
pageSize页大小Ref<number>
total数据总数,remote时为 props.totalInstanceType<typeof ElPagination>
tableData挂在ElTable数据集,分页时为 dataSource,不分页为 props.dataRef<ReTableRow[]>
dataSource当前分页的表格数据Ref<ReTableRow[]>
sortData全量排序后表格数据Ref<ReTableRow[]>
filterData全量过滤后表格数据Ref<ReTableRow[]>

Types

export type ReTableRow = Record<string, any>;

export interface ReTableCustomFilter {
  prop: string;
  value: string;
  ignoreCase?: boolean;
  type?: // 关联字段判断方式 =(等于),!(非),.(包含),^(开头),$(结尾),&(全部匹配),|(部分匹配)
  "=" | "!=" | "." | "!." | "^=" | "=$" | "!^=" | "!=$" | "&." | "!&." | "|.";
}

源代码

Github

/components/ReTable/src/main.vue

可以通过查看具体实现,如果遇到问题可以留言或者提出issue。

hook

分页处理的实现单独抽离了一个hook,自行查看 hook/usePagination 方法,可以利用这个hook实现自己的分页功能。

如果觉得对您有帮助的话,可以请小编瑞一下

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT聊天室基于Tcp

server.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this)) // 给服务器指针对象实例化空间{ui->setupUi(this); }Widget::~Widget() {delete ui; }…

集团数字化转型方案(一)

集团数字化转型方案通过系统集成先进的物联网&#xff08;IoT&#xff09;、大数据分析、人工智能&#xff08;AI&#xff09;和云计算技术&#xff0c;构建一个全面智能化的运营生态系统&#xff0c;涵盖从数据驱动的决策支持、智能化业务流程优化、到全渠道客户体验提升的各个…

【算法基础实验】图论-最小生成树-Prim的即时实现

理论知识 Prim算法是一种用于计算加权无向图的最小生成树&#xff08;MST, Minimum Spanning Tree&#xff09;的贪心算法。最小生成树是一个连通的无向图的子图&#xff0c;它包含所有的顶点且总权重最小。Prim算法从一个起始顶点开始&#xff0c;不断将权重最小的边加入生成…

CTFHUB | web进阶 | JSON Web Token | 无签名

一些JWT库也支持none算法&#xff0c;即不使用签名算法。当alg字段为空时&#xff0c;后端将不执行签名验证 开启题目 账号密码随便输&#xff0c;登录之后显示只有 admin 可以获得 flag 在此页面抓包发到 repeater&#xff0c;这里我们需要用到一个 Burp 插件&#xff0c;按图…

科研绘图配色大全

目录 01 颜色网站 1.1 Material 1.1.1 tailwindcolor 1.2 Trending Color Palettes1.3 Material Palette 1.4 Graphs Colors 1.5 RGB颜色值与十六进制颜色码转换 1.6 colorbrewer 1.7 优设 1.8 Chinese Colors1.9 handpicked colors 02 科研绘图配色方案 2.1 常见科技…

干货:2024必备的四大PDF编辑器推荐!

面对PDF文件的编辑需求&#xff0c;你是否感到无从下手&#xff1f;那么&#xff0c;今天就为大家推荐几款实用的PDF编辑工具&#xff0c;让你轻松应对各种PDF编辑难题。 福昕PDF编辑器 链接&#xff1a;editor.foxitsoftware.cn 福昕PDF编辑器多功能专业级是我PDF编辑器。它…

【C++例题 / 训练】二分算法(模板 例题)

引言 二分也就是二分查找&#xff0c;又叫折半查找。这种算法正如其名&#xff0c;每一次都要分一半。 二分算法可以分为二分查找和二分答案。 以在一个升序数组中查找一个数为例&#xff0c;每次考察数组当前部分的中间元素&#xff0c;如果中间元素刚好是要找的&#xff0…

王牌功能 | 法大大“证据管理”,让关键数据坚不可摧!

到底还能不能好好签合同… 法大大证据管理功能&#xff0c;基于电子合同签署全流程&#xff0c;为使用法大大电子签的机构及个人用户提供互联网数据电文的实时存证&#xff0c;并由第三方机构进行证据固化&#xff0c;将存证的数据电文转化成可读性更高、具有司法效力的证明材料…

多线程、多进程,还是异步?-- Python 并发 API 如何选择

如何选择正确的 Python 并发 API模块 &#xff1f; Python 标准库提供了三种并发 API &#xff0c; 如何知道你的项目应该使用哪个 API&#xff1f; 在本教程将带逐步了解各API的特性、区别以及各自应用场景&#xff0c;指导你选择最合适的并发 API。 多线程、多进程&#xff0…

音频采集spring_ws_webrtc (html采集麦克风转gb711并发送广播播放)完整案例

下载地址&#xff1a;http://www.gxcode.top/code 项目说明 springbootwebscoektwebrtc 项目通过前端webrtc采集麦克风声音&#xff0c;通过websocket发送后台&#xff0c;然后处理成g711-alaw字节数据发生给广播UDP并播放。 后台处理项目使用线程池(5个线程)接受webrtc数据并…

JAVA基础:字节字符转换流

前言 当我们使用流读取数据时&#xff0c;如果这个数据中含有中文&#xff0c;我们对这个数据进行操作就会出现乱码问题&#xff0c;这时候我们要使用字节字符转换流来处理一下数据。 字节字符转换流 字节字符转换流是一个过程流 字节字符转换流是一个字符流&#xff0c;所…

如何为 SEO 做关键词优化

关键词优化是一种基本的 SEO 技术&#xff0c;可以提高你的网站在搜索结果中的可见度&#xff0c;并吸引更多的访问者。 在这份关键词优化指南中&#xff0c;我们将分享在 SEO 的这一方面脱颖而出所需的知识、技巧和技巧。使用本指南可以超越您的竞争对手&#xff0c;并为您的…

一文搞懂数据标注

hihi,大家好,最近开始和内容那个团队研究SD出图了,作为家具家电行业的小牛人,除了研究SD和ComfyUI本身,需要了解算法同学如何进行模型微调的,因为用的是开源的底座,预训练部分就不深入介绍了,重点看一下二次预训练,在这个过程中有一个环节比较关注就是小规模数据集,也…

【java】RuoYi-Vue前后端分离版本-请求被拦截,怎么修改拦截过滤器,解决方案

【java】RuoYi-Vue前后端分离版本-请求被拦截&#xff0c;怎么修改拦截过滤器 它用到了一个安全管理框架Spring Security 你可以通过这篇文章《Spring Security 详解》 去了解它&#xff0c;怎么使用或者使用原理。 所有业务都受SecurityConfig配置所过滤 SecurityConfig配置…

2024年思维导图工具怎样可以轻松选择

思维导图&#xff0c;作为一种直观、有效的思维工具&#xff0c;凭借其强大的信息整理能力和创意激发潜力&#xff0c;逐渐成为了人们学习、工作和生活中不可或缺的一部分。今天&#xff0c;就让我们一起走进这个充满智慧的领域&#xff0c;探索那些2024年大家都在使用的思维导…

Cleer耳机好不好用?南卡、Cleer、飞利浦、倍思横评对比

​大家好&#xff0c;作为一位多年的数码博主和耳机发烧友&#xff0c;最近后台收到不少私信&#xff0c;都是小伙伴想让我测评一下最近很火热的开放式耳机&#xff0c;那么为了回馈大家这么久的支持&#xff0c;说做就做&#xff01;我买了最近网上很热门的几款开放式耳机&…

电线 硬线 和软线 连接

电线 硬线 和软线 连接 首先把软线&#xff0c;拧成一股&#xff0c;然后搭到硬线上回转一圈&#xff0c;这里要注意线头往反向回转&#xff0c;大家看下图中的软线&#xff0c; 再在硬线上缠绕7—8圈&#xff0c;根据线的长短&#xff0c;过长就剪去一些。 最后将硬导线往后弯…

【速览】设计模式(更新中)

目录 一、背景二、优缺点优点缺点 三、适用场景四、核心组成创建型模式 Creational Design Pattern 5结构型模式 Structural Design Patterns 7行为型模式 Behavioral Design Patterns 11’ 五、底层原理六、对比参考 一、背景 这个技术出现的背景、初衷和要达到什么样的目标或…

【Python开发实践】在线商城系统——需求及需求分析

项目背景及需求 这个练习项目的设置背景是一家图书销售公司&#xff0c;为了扩大销售渠道&#xff0c;想要开通网上商城&#xff0c;利用在线博客和电子商城来销售图书。 具体需求如下&#xff1a; 每个商品可以留言 实现在线购物车处理和订单处理 实现对产品、购物车和订单的…

python | 图片转换为 pdf 实现方法

目录 一、PIL 库简介及安装使用方法 &#xff08;一&#xff09;python 不同版本下 PIL 的使用方法 二、图片转换为 pdf 的两种实现方法 &#xff08;一&#xff09;简易版——pdf 页面尺寸跟随图片大小 &#xff08;二&#xff09;常用版——pdf 每页尺寸统一为 A4 一、P…