当前位置: 首页 > news >正文

基于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 所有属性,同时扩展了 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实现自己的分页功能。

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

在这里插入图片描述

在这里插入图片描述

相关文章:

基于ElementPlus的分页表格组件ReTable

分页表格ReTable 组件实现基于 Vue3 Element Plus Typescript&#xff0c;同时引用 vueUse lodash-es tailwindCss (不影响功能&#xff0c;可忽略) 基于ElTable和ElPagination组件封装的分页表格&#xff0c;支持本地分页以及远程请求两种方式。本地数据分页自带全量数据的…...

力扣题/图论/课程表

课程表 力扣原题 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课程 ai 则 必须 先学习课…...

SQL进阶技巧:基于指定规则的缺失值填充问题

目录 0 场景描述 1 数据准备 2 问题分析 3 小结 0 场景描述 有如下breed表。表中有breed、dt、value字段,value值中存在大量的NULL值,NULL值为缺省值,缺省值需要按照一定规则进行填充。 规则如下: 用表中value值紧邻且非空的两行均值进行填充。 1 数据准备 with bre…...

【气象百科】光伏自动气象站的功能优势

随着全球对可再生能源需求的日益增长&#xff0c;光伏发电作为清洁、可再生的能源形式&#xff0c;正逐步成为推动能源转型的重要力量。而光伏自动气象站&#xff0c;作为光伏电站智能化管理的重要组成部分&#xff0c;其独特的功能优势在提升光伏系统效率、优化运维策略、增强…...

嵌入式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下打开…...

android13隐藏调节声音进度条下面的设置按钮

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 3.代码修改 4.编译运行 5.彩蛋 1.前言 将下面的声音调节底下的三个点的设置按钮,隐藏掉。 效果如下 2.情况分析 查看布局文件 通过布局我们可以知道这个按钮就是 com.android.keyguard.AlphaOptimizedImageB…...

Java ArrayList和LinkedList

ArrayList ArrayList是Java中最常用的数据结构之一&#xff0c;它是一个动态数组的实现&#xff0c;允许你在程序中存储和管理一个可变大小的对象列表&#xff0c;我们可以添加或删除元素。 ArrayList 继承了 AbstractList &#xff0c;并实现了 List 接口。 基本概念 Arra…...

STM32F030行列式按键扫描

1&#xff09;行扫说明&#xff0c;行列式按键扫描时&#xff1a; 行输出&#xff1a;行逐一输出高电平&#xff0c;其他的为低&#xff0c;既循环只输出一个高电平&#xff1b; 列读入&#xff1a;所有列通过下拉电阻100K后&#xff0c;都变为低电平&#xff0c;逐一读入&…...

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…...

Android MVVM框架详解与应用

在Android开发中&#xff0c;随着应用复杂度的增加&#xff0c;如何有效地组织和管理代码成为了一个重要的问题。MVVM&#xff08;Model-View-ViewModel&#xff09;架构模式因其清晰的结构和高效的开发效率&#xff0c;逐渐成为Android开发者们青睐的架构模式之一。本文将详细…...

浅析KHD-厨帽检测算法从源码到实际应用的方案

厨帽检测算法&#xff0c;作为计算机视觉技术在食品安全领域的一项重要应用&#xff0c;其实际应用过程涉及多个方面。 厨帽检测算法主要基于深度学习技术&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;和目标检测框架&#xff08;如YOLO、Faster RCNN等&#xff…...

ESXi里的FreeBSD装bhyve Ubuntu子系统,外网不通,子系统里无法ping通外面(使用NAT解决)

ESXi里的FreeBSD装bhyve Ubuntu子系统&#xff0c;子系统里无法ping通外面&#xff0c;除了宿主机&#xff0c;其它ip都ping不通。&#xff08;另一台FreeBSD物理机同样的bhyve ubuntu子系统&#xff0c;网络就是通的&#xff0c;但是TrinityCore服务lag延时很大&#xff09; …...

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’…...

盘点数据摆渡的8种常用方式 最推荐哪一种?

跨网数据摆渡是很多企业面临的一种传输场景&#xff0c;因为大部分企业为了保护核心数据&#xff0c;都会做不同级别的网络隔离&#xff0c;所以数据摆渡会涉及不同网络之间的数据传输和整合。这种情况下&#xff0c;数据需要从一个组织或地理位置传输到另一个组织或地理位置&a…...

仿照ContentLoadingProgressBar 的特点在Android项目中自定义Loading对话框

ContentLoadingProgressBar 是 Android 中的一个控件&#xff0c;继承自 ProgressBar。它在 ProgressBar 的基础上添加了一些特殊功能&#xff0c;主要用于在加载内容时显示进度。它的一些主要特点如下&#xff1a; 自动隐藏和显示&#xff1a;ContentLoadingProgressBar 会在…...

基于数据复杂度的数据库选型

数据模型的选择对于 IT 系统的开发至关重要&#xff0c;它不仅决定了数据存储和处理的方式&#xff0c;影响系统的性能、扩展性以及维护性等。本质上来说&#xff0c;不同的数据模型反映了我们对业务问题的不同思考和抽象程度。 今天我们从不同数据模型对于复杂数据和关系的支…...

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-&…...

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>:…...

shell编程:安装部署前常见环境检查

脚本任务 监测主机是否联通正常 检查安装操作系统版本是否和需求一致 检查CPU是否满足规格要求 检查内存是否满足规格要求 检查数据磁盘是否满足规格要求 检查操作系统分区目录大小是否满足需求 检查集群主机时间是否一致 0.配置文件准备及脚本变量初始化 编写config.i…...

思特科技:国家宝藏数字体验馆展现东方美学 让“文物活起来”

01      思特科技为“国家宝藏数字体验展”提供“数字技术”支持&#xff0c;带来国宝的数字化演绎。以《国家宝藏》顶级IP为基础&#xff0c;打造的全新沉浸文化项目“国宝数字体验展“&#xff0c;借由文物的视角、站在历史的星河中&#xff0c;探寻时间长河中不变的智慧…...

ES6笔记总结(Xmind格式):第二天

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; ES6知识总结 Proxy&#xff08;代理&#xff09;&#xff1a; 1.作用&#xff1a;实现数据的私有化处理 2.target 目标对象 handler处理函数 3.处理函数中有两个方法&#xff1a;get,set 4.读取数据会触发g…...

Kotlin 流flow、ShareFlow、StateFlow、Channel的解释与使用

一、介绍 随着Android接入kotlin开发&#xff0c;Android之前好多模式也渐渐被kotlin替代。开发模式也在做渐进的转型&#xff0c;从MVC到MVP在到MVVP以及现在的MVI等。 流IO在java中和kotlin中使用率都是比较高的&#xff0c;场景很多。如Java的IO和NIO&#xff0c;再到我们现…...

【个人学习】JVM(7):方法区概述、方法区内部结构、垃圾回收等

方法区 栈、堆、方法区的交互关系 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型场景就是数据库连接管理,以及会话管理。 栈、堆、方法区的交互关系 下面涉及了对象的访问定位 Person 类的 .class 信息存放在方法区中person 变量存放…...

@Scheduled 定时任务自定义

简介 Scheduled 定时任务自定义可以通过SchedulingConfigurer实现。 SchedulingConfigurer 是 Spring Framework 中的一个接口&#xff0c;用于配置定时任务。当你需要对定时任务进行更高级别的定制时&#xff0c;这个接口就显得非常有用。 可以通过SchedulingConfigurer 接口…...

一种新颖的面试方式

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…...

【Linux】生产消费模型实践 --- 基于信号量的环形队列

你送出去的每颗糖都去了该去的地方&#xff0c; 其实地球是圆的&#xff0c; 你做的好事终会回到你身上。 --- 何炅 --- 基于信号量的环形队列 1 信号量2 框架构建3 代码实现4 测试运行 1 信号量 信号量本质是一个计数器&#xff0c;可以在初始化时对设置资源数量&#xf…...

Science Robotics 与蜜蜂群互动的蜂窝型机器人系统

蜜蜂&#xff0c;如黄蜂&#xff0c;蚂蚁和其他社会昆虫&#xff0c;建立大型自组织群体&#xff0c;通常被解释为自我调节的“超有机体”。这些超生物是生态系统的重要稳定剂&#xff0c;因此被认为是“关键物种”。例如&#xff0c;蜜蜂群落通过觅食授粉服务的生态效应对陆地…...

Vue 计算属性:优雅地处理数据逻辑

在 Vue.js 中&#xff0c;计算属性&#xff08;Computed Properties&#xff09;是一种非常实用的功能&#xff0c;它允许我们根据组件的响应式依赖进行缓存和派生状态。计算属性可以让我们以声明式的方式编写复杂的逻辑&#xff0c;而不必担心性能问题。 什么是计算属性&…...

C++中`union`

文章目录 C中的union什么是union&#xff1f;定义union示例一输出结果&#xff1a; 示例二修正后的代码解释输出结果结论 union的特性匿名union示例 union和struct的区别1. 内存布局2. 同时访问3. 用途 union和class的区别1. 数据成员2. 功能性3. 适用场景 在C编程中&#xff0…...

Linux——网络(1)

一、IPC&#xff08;进程间通信方式&#xff09; IPC&#xff1a;Inter Process Communication 共享内存&#xff08;最高效的进程间通信方式&#xff09; 虚拟地址 mmu(memory management unit ) 共享内存: 1.是一块&#xff0c;内核预留的空间 2.最高效的…...

wordpress新淘客/建立自己的网站

需求 在使用Docker的过程中&#xff0c;有时候我们会有将Docker容器配置到和主机同一网段的需求。要实现这个需求&#xff0c;我们只要将Docker容器和主机的网卡桥接起来&#xff0c;再给Docker容器配上IP就可以了。 下面我们就使用pipework工具来实现这一需求。 安装pipework …...

四川省建设建设监理协会网站/怎么打广告宣传自己的产品

Frontend Knowledge Structure https://github.com/JacksonTian/fks 图片的形式具有诸多的不便。缺失源图的我们&#xff0c;无法为此图贡献些什么&#xff0c;随着时间的迁移&#xff0c;或许有些技术点会发生改变&#xff0c;所以有了这个GitHub项目。我们可以通过协作的方式…...

烹饪考试试卷哪个网站可以做/新闻 今天

python提供了一些有趣且实用的函数&#xff0c;如any all zip&#xff0c;这些函数能够大幅简化我们的代码&#xff0c;可以更优雅的处理可迭代的对象&#xff0c;同时使用的时候也得注意一些情况anyany(iterable)Return True if any element of the iterable is true. If the …...

南通做百度网站的公司/搜索引擎营销ppt

我们知道&#xff0c;Cocos Creator内置的物理引擎有RopeJoint组件&#xff0c;可以帮助我们做一根普通的绳子&#xff0c;废话不多说&#xff0c;直接开始。 首先看一下RopeJoint组件的属性&#xff1a; 上图中的Connected Body是当前节点连接的锚点&#xff0c;什么意思呢&…...

大连网站开发企业/宁波网站推广营销

1. Php图片上传12. PHP函数getimagesize的具体使用方法4 3. 异步上传图片5 1. Php图片上传 上传步骤&#xff1a; 1、创建一个文件上传表单 <html> <body> <form action"upload_file.php" method"post" enctype"multipart/form-data&q…...

茂名网站开发公司/seo公司优化排名

jQuery jQuery样式操作样式操作1、获取样式属性与操作样式属性2、操作样式类名3、click事件绑定4、使用.toggleClass切换类样式5、选项卡1、获取样式属性与操作样式属性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…...