基于ElementPlus的分页表格组件ReTable
分页表格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 所有属性,同时扩展了 options
、labelKey
、valueKey
用于自动解构枚举值,默认情况下 columnKey会自动赋值为prop,同时 options
也会构造成 filters
生成过滤器选型,如果不想生成过滤器,可以通过指定 filterable=false
取消。
查看 /demo/table/basic.md
本地过滤
默认情况下如果列配置项带有枚举值数据项 options
会自动根据 labelKey
、valueKey
构造成 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-change
和 filter-change
获取当前排序状态和过滤状态。
查看 /demo/table/remote.md
ReTable属性
字段 | 说明 | 类型 | 默认值 |
---|---|---|---|
pagination | 是否开启分页 | boolean | true |
rowKey | 数据项主键名称 | string | “id” |
emptyText | 空状态文本说明 | string | “暂无数据” |
columns | 必填,表格列配置 | ReTableColumn[] | - |
data | 必填,数据集 | ReTableRow[] | - |
stripe | 条纹表格 | boolean | false |
border | 是否带边框 | boolean | false |
reversePageAfterSort | 是否在排序变更后重置页码 | boolean | false |
gutter | 表格间距 | “default” | “small” | “medium” | “default” |
customFilters | 自定义过滤条件 | ReTableCustomFilter[] | - |
除了上述属性,ElTable属性也都支持,默认会被ElTable实例继承
ReTable继承CustomPagination属性,其他一些分页请求相关属性参考下面
CustomPagination属性
字段 | 说明 | 类型 | 默认值 |
---|---|---|---|
pageSize(v-model) | 页大小 | number | 10 |
currentPage(v-model) | 当前页码 | number | 1 |
total(v-model) | 数据总数,remote=true有效,且必须指定 | number | - |
paginationProps | ElPagination属性 | Partial<PaginationProps> | - |
autoRemote | 自动请求,remote=true有效 | boolean | false |
firstRemote | 首次渲染自动请求,remote=true有效 | boolean | false |
remote | 是否开启远程请求 | boolean | false |
remoteMethod | 远程请求方法 | ({currentPage: number; pageSize: number;}, filters: Record<string, any>, sorts?: Record<string, any>) => Promise<any> | - |
dataResponsive | 是否开启数据响应,remote=true有效,total、data支持v-model双向绑定 | boolean | false |
resetCurrentPage | 数据变更是否重置页码 | boolean | true |
ReTableColumn字段
字段 | 说明 | 类型 | 默认值 |
---|---|---|---|
options | 字段关联枚举值数据,默认会构造filters字段,以及自动转成labelKey展示 | Array<{[labelKey]: string, [valueKey]: any}> | - |
labelKey | 枚举值标签名字段 | string | - |
valueKey | 枚举值键值字段 | string | - |
slot | 列内容作用域插槽名 | string | - |
headerSlot | 列表头作用域插槽名 | string | - |
filterIconSlot | 列表头自定义过滤器图标插槽名 | string | - |
filterable | 是否开启过滤,设置false会取消options转filters的默认行为 | boolean | true |
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 | 空状态展示 |
append | ElTable append插槽 |
[headerSlot] | 每个表单配置项都支持表头插槽,通过headerSlot指定 |
[filterIconSlot] | 每个表单配置项都支持表头过滤器图标插槽,通过filterIconSlot指定 |
[slot] | 每个表单配置项都支持内容作用域插槽,通过slot指定 |
[headerSlot]、[filterIconSlot]、[slot]插槽名有列配置决定
ReTable Expose
字段 | 说明 | 类型 |
---|---|---|
tableRef | ElTable组件实例 | InstanceType<typeof ElTable> |
pagerRef | ElPagination组件示例 | InstanceType<typeof ElPagination> |
toRemote | 远程请求方法 | () => void |
loading | 加载状态 | Ref<boolean> |
currentPage | 当前页码 | Ref<number> |
pageSize | 页大小 | Ref<number> |
total | 数据总数,remote时为 props.total | InstanceType<typeof ElPagination> |
tableData | 挂在ElTable数据集,分页时为 dataSource,不分页为 props.data | Ref<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实现自己的分页功能。
如果觉得对您有帮助的话,可以请小编瑞一下
相关文章:
![](https://i-blog.csdnimg.cn/direct/503a6235e74545f2a1642f51cbfeecd3.jpeg)
基于ElementPlus的分页表格组件ReTable
分页表格ReTable 组件实现基于 Vue3 Element Plus Typescript,同时引用 vueUse lodash-es tailwindCss (不影响功能,可忽略) 基于ElTable和ElPagination组件封装的分页表格,支持本地分页以及远程请求两种方式。本地数据分页自带全量数据的…...
![](https://www.ngui.cc/images/no-images.jpg)
力扣题/图论/课程表
课程表 力扣原题 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课…...
![](https://i-blog.csdnimg.cn/direct/7b4ce5e5531c40c692fd8cb5a816f0aa.png)
SQL进阶技巧:基于指定规则的缺失值填充问题
目录 0 场景描述 1 数据准备 2 问题分析 3 小结 0 场景描述 有如下breed表。表中有breed、dt、value字段,value值中存在大量的NULL值,NULL值为缺省值,缺省值需要按照一定规则进行填充。 规则如下: 用表中value值紧邻且非空的两行均值进行填充。 1 数据准备 with bre…...
![](https://img-blog.csdnimg.cn/img_convert/f557d900626a79380ed56d539caef901.jpeg)
【气象百科】光伏自动气象站的功能优势
随着全球对可再生能源需求的日益增长,光伏发电作为清洁、可再生的能源形式,正逐步成为推动能源转型的重要力量。而光伏自动气象站,作为光伏电站智能化管理的重要组成部分,其独特的功能优势在提升光伏系统效率、优化运维策略、增强…...
![](https://i-blog.csdnimg.cn/direct/521a279065954031a102c2cd69b37a06.png)
嵌入式AI快速入门课程-K510篇 (第二篇 Ubuntu的基础操作)
第二篇 Ubuntu的基础操作 文章目录 第二篇 Ubuntu的基础操作1. 安装 VMware 运行 Ubuntu1.1 安装 VMware 1.2 使用VMware打开Ubuntu1.2.1 下载、解压Ubuntu映像文件1.2.1 在BIOS上启动虚拟化(virtualization)1.1.1 使用VMware运行Ubuntu 2.第1章 Ubuntu操作入门1.1 Ubuntu下打开…...
![](https://i-blog.csdnimg.cn/direct/c56a8b2f4925499785384b13f4f04371.png)
android13隐藏调节声音进度条下面的设置按钮
总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 3.代码修改 4.编译运行 5.彩蛋 1.前言 将下面的声音调节底下的三个点的设置按钮,隐藏掉。 效果如下 2.情况分析 查看布局文件 通过布局我们可以知道这个按钮就是 com.android.keyguard.AlphaOptimizedImageB…...
![](https://www.ngui.cc/images/no-images.jpg)
Java ArrayList和LinkedList
ArrayList ArrayList是Java中最常用的数据结构之一,它是一个动态数组的实现,允许你在程序中存储和管理一个可变大小的对象列表,我们可以添加或删除元素。 ArrayList 继承了 AbstractList ,并实现了 List 接口。 基本概念 Arra…...
![](https://i-blog.csdnimg.cn/direct/e4ca91b2e2364a96aced94c374f8729b.png)
STM32F030行列式按键扫描
1)行扫说明,行列式按键扫描时: 行输出:行逐一输出高电平,其他的为低,既循环只输出一个高电平; 列读入:所有列通过下拉电阻100K后,都变为低电平,逐一读入&…...
![](https://img-blog.csdnimg.cn/img_convert/96d7659b6144b5a2b28362560cb9c110.png)
FPGA 综合笔记
仿真时阻塞赋值和非阻塞赋值 Use of Non-Blocking Assignment in Testbench : Verilog Use of Non-Blocking Assignment in Testbench : Verilog - Stack Overflow non-blocking assignment does not work as expected in Verilog non-blocking assignment does not work a…...
![](https://www.ngui.cc/images/no-images.jpg)
Android MVVM框架详解与应用
在Android开发中,随着应用复杂度的增加,如何有效地组织和管理代码成为了一个重要的问题。MVVM(Model-View-ViewModel)架构模式因其清晰的结构和高效的开发效率,逐渐成为Android开发者们青睐的架构模式之一。本文将详细…...
![](https://img-blog.csdnimg.cn/img_convert/d8e36333344240414609f606155ba0a3.png)
浅析KHD-厨帽检测算法从源码到实际应用的方案
厨帽检测算法,作为计算机视觉技术在食品安全领域的一项重要应用,其实际应用过程涉及多个方面。 厨帽检测算法主要基于深度学习技术,特别是卷积神经网络(CNN)和目标检测框架(如YOLO、Faster RCNN等ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
ESXi里的FreeBSD装bhyve Ubuntu子系统,外网不通,子系统里无法ping通外面(使用NAT解决)
ESXi里的FreeBSD装bhyve Ubuntu子系统,子系统里无法ping通外面,除了宿主机,其它ip都ping不通。(另一台FreeBSD物理机同样的bhyve ubuntu子系统,网络就是通的,但是TrinityCore服务lag延时很大) …...
![](https://www.ngui.cc/images/no-images.jpg)
Connectionist Logic Systems and Hybrid Systems by Translation
Connectionist Logic Systems Definition: Connectionist Logic Systems (CLS) are computational models that combine elements of connectionism (neural networks) with symbolic logic. These systems aim to leverage the strengths of both paradigms—connectionism’…...
![](https://img-blog.csdnimg.cn/img_convert/7105da96754ef40f444ba46cab973ca4.jpeg)
盘点数据摆渡的8种常用方式 最推荐哪一种?
跨网数据摆渡是很多企业面临的一种传输场景,因为大部分企业为了保护核心数据,都会做不同级别的网络隔离,所以数据摆渡会涉及不同网络之间的数据传输和整合。这种情况下,数据需要从一个组织或地理位置传输到另一个组织或地理位置&a…...
![](https://i-blog.csdnimg.cn/direct/26705f1cd73043c887bd06b6ea04e07d.png#pic_center)
仿照ContentLoadingProgressBar 的特点在Android项目中自定义Loading对话框
ContentLoadingProgressBar 是 Android 中的一个控件,继承自 ProgressBar。它在 ProgressBar 的基础上添加了一些特殊功能,主要用于在加载内容时显示进度。它的一些主要特点如下: 自动隐藏和显示:ContentLoadingProgressBar 会在…...
![](https://i-blog.csdnimg.cn/direct/8de0026d4a02456da076b406aa6758af.png#pic_center)
基于数据复杂度的数据库选型
数据模型的选择对于 IT 系统的开发至关重要,它不仅决定了数据存储和处理的方式,影响系统的性能、扩展性以及维护性等。本质上来说,不同的数据模型反映了我们对业务问题的不同思考和抽象程度。 今天我们从不同数据模型对于复杂数据和关系的支…...
![](https://i-blog.csdnimg.cn/direct/7443dc7c3862454f909404fd31f0f3b5.png)
QT基础知识5
思维导图 client.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), socket(new QTcpSocket(this))//给客户端实例化分配空间 {ui->setupUi(this);//初始化界面ui->msgEdit-&…...
![](https://i-blog.csdnimg.cn/direct/bc264f044a5c4de8b3ee488f47c793d6.png)
C++中vector存放内置数据类型
#include<iostream> using namespace std; #include<vector> #include<algorithm>//迭代器先理解为指针 void MyPrint(int val) {cout << val << endl; } void test01() {vector<int> v;v.push_back(1);v.push_back(2);vector<int>:…...
![](https://www.ngui.cc/images/no-images.jpg)
shell编程:安装部署前常见环境检查
脚本任务 监测主机是否联通正常 检查安装操作系统版本是否和需求一致 检查CPU是否满足规格要求 检查内存是否满足规格要求 检查数据磁盘是否满足规格要求 检查操作系统分区目录大小是否满足需求 检查集群主机时间是否一致 0.配置文件准备及脚本变量初始化 编写config.i…...
![](https://i-blog.csdnimg.cn/direct/437e38dbd5e143ae8ddb55633cb97801.png#pic_center)
思特科技:国家宝藏数字体验馆展现东方美学 让“文物活起来”
01 思特科技为“国家宝藏数字体验展”提供“数字技术”支持,带来国宝的数字化演绎。以《国家宝藏》顶级IP为基础,打造的全新沉浸文化项目“国宝数字体验展“,借由文物的视角、站在历史的星河中,探寻时间长河中不变的智慧…...
![](https://i-blog.csdnimg.cn/direct/c6e9f67f5b544777806af5f1817f742b.png)
ES6笔记总结(Xmind格式):第二天
Xmind鸟瞰图: 简单文字总结: ES6知识总结 Proxy(代理): 1.作用:实现数据的私有化处理 2.target 目标对象 handler处理函数 3.处理函数中有两个方法:get,set 4.读取数据会触发g…...
![](https://i-blog.csdnimg.cn/direct/1acf9c541efa4566b8b370a5f1b4fcaa.png)
Kotlin 流flow、ShareFlow、StateFlow、Channel的解释与使用
一、介绍 随着Android接入kotlin开发,Android之前好多模式也渐渐被kotlin替代。开发模式也在做渐进的转型,从MVC到MVP在到MVVP以及现在的MVI等。 流IO在java中和kotlin中使用率都是比较高的,场景很多。如Java的IO和NIO,再到我们现…...
![](https://img-blog.csdnimg.cn/img_convert/2d130e588380e083aec940d7003bf320.png)
【个人学习】JVM(7):方法区概述、方法区内部结构、垃圾回收等
方法区 栈、堆、方法区的交互关系 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型场景就是数据库连接管理,以及会话管理。 栈、堆、方法区的交互关系 下面涉及了对象的访问定位 Person 类的 .class 信息存放在方法区中person 变量存放…...
![](https://www.ngui.cc/images/no-images.jpg)
@Scheduled 定时任务自定义
简介 Scheduled 定时任务自定义可以通过SchedulingConfigurer实现。 SchedulingConfigurer 是 Spring Framework 中的一个接口,用于配置定时任务。当你需要对定时任务进行更高级别的定制时,这个接口就显得非常有用。 可以通过SchedulingConfigurer 接口…...
![](https://www.ngui.cc/images/no-images.jpg)
一种新颖的面试方式
你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…...
![](https://i-blog.csdnimg.cn/direct/85c79589059f482c81c92c8bab11deaf.gif)
【Linux】生产消费模型实践 --- 基于信号量的环形队列
你送出去的每颗糖都去了该去的地方, 其实地球是圆的, 你做的好事终会回到你身上。 --- 何炅 --- 基于信号量的环形队列 1 信号量2 框架构建3 代码实现4 测试运行 1 信号量 信号量本质是一个计数器,可以在初始化时对设置资源数量…...
![](https://www.ngui.cc/images/no-images.jpg)
Science Robotics 与蜜蜂群互动的蜂窝型机器人系统
蜜蜂,如黄蜂,蚂蚁和其他社会昆虫,建立大型自组织群体,通常被解释为自我调节的“超有机体”。这些超生物是生态系统的重要稳定剂,因此被认为是“关键物种”。例如,蜜蜂群落通过觅食授粉服务的生态效应对陆地…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue 计算属性:优雅地处理数据逻辑
在 Vue.js 中,计算属性(Computed Properties)是一种非常实用的功能,它允许我们根据组件的响应式依赖进行缓存和派生状态。计算属性可以让我们以声明式的方式编写复杂的逻辑,而不必担心性能问题。 什么是计算属性&…...
![](https://www.ngui.cc/images/no-images.jpg)
C++中`union`
文章目录 C中的union什么是union?定义union示例一输出结果: 示例二修正后的代码解释输出结果结论 union的特性匿名union示例 union和struct的区别1. 内存布局2. 同时访问3. 用途 union和class的区别1. 数据成员2. 功能性3. 适用场景 在C编程中࿰…...
![](https://i-blog.csdnimg.cn/direct/661e42e64cd6404285e91748e5a5113f.png)
Linux——网络(1)
一、IPC(进程间通信方式) IPC:Inter Process Communication 共享内存(最高效的进程间通信方式) 虚拟地址 mmu(memory management unit ) 共享内存: 1.是一块,内核预留的空间 2.最高效的…...
![](/images/no-images.jpg)
wordpress新淘客/建立自己的网站
需求 在使用Docker的过程中,有时候我们会有将Docker容器配置到和主机同一网段的需求。要实现这个需求,我们只要将Docker容器和主机的网卡桥接起来,再给Docker容器配上IP就可以了。 下面我们就使用pipework工具来实现这一需求。 安装pipework …...
四川省建设建设监理协会网站/怎么打广告宣传自己的产品
Frontend Knowledge Structure https://github.com/JacksonTian/fks 图片的形式具有诸多的不便。缺失源图的我们,无法为此图贡献些什么,随着时间的迁移,或许有些技术点会发生改变,所以有了这个GitHub项目。我们可以通过协作的方式…...
![](/images/no-images.jpg)
烹饪考试试卷哪个网站可以做/新闻 今天
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们的代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况anyany(iterable)Return True if any element of the iterable is true. If the …...
![](https://img-blog.csdnimg.cn/2020111415362618.png#pic_center)
南通做百度网站的公司/搜索引擎营销ppt
我们知道,Cocos Creator内置的物理引擎有RopeJoint组件,可以帮助我们做一根普通的绳子,废话不多说,直接开始。 首先看一下RopeJoint组件的属性: 上图中的Connected Body是当前节点连接的锚点,什么意思呢&…...
![](http://top.oa.com/pictures/201209/1347276387_34.png)
大连网站开发企业/宁波网站推广营销
1. Php图片上传12. PHP函数getimagesize的具体使用方法4 3. 异步上传图片5 1. Php图片上传 上传步骤: 1、创建一个文件上传表单 <html> <body> <form action"upload_file.php" method"post" enctype"multipart/form-data&q…...
![](https://img-blog.csdnimg.cn/de11186e92ed4b2fad46e9e42b2e0466.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1b3FpbmdydTAzMTE=,size_16,color_FFFFFF,t_70)
茂名网站开发公司/seo公司优化排名
jQuery jQuery样式操作样式操作1、获取样式属性与操作样式属性2、操作样式类名3、click事件绑定4、使用.toggleClass切换类样式5、选项卡1、获取样式属性与操作样式属性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…...