Element-Plus中表格及分页功能

导入Element-Plus

具体步骤如下:(内容参照官网:安装 | Element Plus)

# 选择一个你喜欢的包管理器# NPM
$ npm install element-plus --save# Yarn
$ yarn add element-plus# pnpm
$ pnpm install element-plus

安装完成后即可在官网组件部分查找自己想用的插件进行使用了。 

VUE2版本方式

一、将官网中HTML源码复制到自己的文件中,对其中的参数进行修改。主要修改的是数据的绑定和部分样式的选择。
  <div class="demo-pagination-block"><div class="example-demonstration"><el-table :data="currentData" style="width: 100%"><el-table-column fixed type="index" :index="indexMethod" label="序号" width="50" /><el-table-column prop="nativeTip" show-overflow-tooltip label="本国子目" width="100" /><el-table-column prop="childrenTip" show-overflow-tooltip label="子目条文" width="100" /><el-table-column prop="date" label="数据版本" width="100" /><el-table-column fixed="right" label="操作" width="60"><template #default="scope"><el-button link type="primary" size="small" @click="handleClick(scope.$index)">详细</el-button></template></el-table-column></el-table></div>
<!-- 分页器 --><el-pagination v-model:current-page="searchParams.pagenum" v-model:page-size="searchParams.pagesize" :small="small":disabled="disabled" background layout="total,prev, pager, next, jumper" :total="total"@size-change="handleSizeChange" @current-change="handleCurrentChange" /></div>

说明:这里我用了首列索引来作为表头元素,但索引值并不是渲染在页面上副本数组中的索引,而是通过该索引计算后的值(即需要渲染在页面上的值),所以通过:index="indexMethod",绑定了indexMethod方法,该方法在methods中定义。

二、将JavaScript中的源码复制后进行修改
	export default {data() {return {searchParams: {pagesize: 5, //页面条数pagenum: 1, //当前页},total: 0,disabled: false, //是否禁选small: true,currentData: [], //渲染在页面上的副本tableData: [//虚拟数据{nativeTip: 'Cals',childrenTip: 'Tom',date: '2016-05-02',},{nativeTip: 'Sdaornia',childrenTip: 'Tom',date: '2016-05-22',},{nativeTip: 'Csfofif',childrenTip: 'Tom',date: '2016-05-21',}, {nativeTip: 'Gsdaw',childrenTip: 'Tom',date: '2016-05-11',}, {nativeTip: '2016-05-12',childrenTip: 'Tom',date: 'California',}, {nativeTip: 'FedDsa',childrenTip: 'Tom',date: '2016-05-04',},{nativeTip: 'California',childrenTip: 'Tom',date: '2016-05-31',}, {nativeTip: 'California',childrenTip: 'Tom',date: '2016-05-01',}, {nativeTip: 'California',childrenTip: 'Tom',date: '2016-05-04',}]};}}

 说明:这里用的是虚拟数据,所以需要一个副本将虚拟数据的内容进行深拷贝,然后根据当前页面大小和当前页数进行计算,将最终的副本数据进行渲染到页面上。步骤如下:

  1. 每次调用切换页面都将虚拟数据进行深拷贝到副本数据中。
  2. 对副本数据进行处理,根据要渲染第几页数据、一页有几条数据进行裁剪。
  3. 将最终的副本渲染到页面上。
methods: {// 修改索引indexMethod(index) {return index + 1 + (this.searchParams.pagenum - 1) * this.searchParams.pagesize},handleSizeChange(e) {console.log('SizeChange', e)},// 切换当前页面handleCurrentChange(e) {console.log('CurrentChange', e)this.searchParams.pagenum = e// 1.将获取到的数据存入副本中 深拷贝this.currentData = JSON.parse(JSON.stringify(this.tableData))console.log(this.tableData)// 2. 对数据进行处理let len = this.currentData.length //数据总条数console.log(len)this.total = lenconsole.log('this.total', this.total)let num = len - this.searchParams.pagesize //判断是否过长了 多了多少个元素console.log(num)if (num > 0 && this.searchParams.pagenum === 1) {// 2.1 如果是第一页 且长度超过了页面展示长度// 进行裁剪 从页面展示的最后一个元素开始 一共num个元素this.currentData.splice(this.searchParams.pagesize, num)console.log(this.currentData)} else if (num > 0 && this.searchParams.pagenum !== 1) {// 数据过长 但不是第一页// 2.2.1 先裁剪掉前面的元素this.currentData.splice(0, (this.searchParams.pagenum - 1) * this.searchParams.pagesize)// 2.2.2 再裁剪掉后面的元素let len2 = this.currentData.length //判断是否过长了 还多了多少个元素if (len2 - this.searchParams.pagesize > 0) {this.currentData.splice((this.searchParams.pagesize), len2 - this.searchParams.pagesize)}}}},onLoad() {this.handleCurrentChange(1)}
项目成果: 

VUE3版本方式

 Vue3和Vue2的区别

两个最本质的区别在于拷贝,因为Vue3使用的是组合式API,所以在响应式基础上,能够对data中的数组进行直接拷贝渲染。

完整项目实例:
<template><div><!-- 面包屑 :separator-icon="ArrowRight"--><el-breadcrumb><el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item><el-breadcrumb-item>账号列表</el-breadcrumb-item></el-breadcrumb><!-- 白色内容区域 --><div class="page_content"><div class="flex"><div class="input_box"><el-input v-model="searchParams.query" placeholder="搜索关键字" class="input-with-select"><template #append><el-button @click="searchList"><el-icon><Search /></el-icon></el-button></template></el-input></div><el-button type="primary" @click="addUser">新建用户</el-button></div><!-- 表格 --><!-- el-table  的  data:要展示的数据数组el-table-column:列 prop每条数据的对应属性label:列标题scope.row:相当于一条数据--><el-table :data="users" style="width: 100%"><el-table-column prop="username" label="姓名" width="180" /><el-table-column prop="email" label="邮箱" width="180" /><el-table-column prop="mobile" label="电话" /><el-table-column prop="role_name" label="角色" /><el-table-column prop="mg_state" label="状态"><!-- <template #default="scope"><el-switchv-model="scope.row.mg_state"@change="switchChange(scope.row)"/></template> --></el-table-column><el-table-column label="操作"><template #default="scope"><el-button type="primary" @click="editRow(scope.row)">编辑</el-button><el-button type="danger" @click="deleteRow(scope.row)">删除</el-button></template></el-table-column><!-- mg_state 状态 --></el-table><!-- 分页 --><el-pagination v-model:currentPage="searchParams.pagenum" v-model:page-size="searchParams.pagesize":page-sizes="[1, 3, 5, 10]" layout="total, sizes, prev, pager, next" :total="total" @size-change="searchList"@current-change="searchList" /></div><!-- 编辑弹窗 --><el-dialog v-model="dialogFormEVisible" title="编辑用户"><!-- 表单 | email    | 邮箱     | 可以为空 || mobile   | 手机号   | 可以为空 |--><el-form ref="userForm2" :model="formData2" :rules="rules2"><el-form-item label="邮箱" prop="email"><el-input v-model="formData2.email" placeholder="请输入用户邮箱" /></el-form-item><el-form-item label="手机号" prop="mobile"><el-input v-model="formData2.mobile" placeholder="请输入用户手机号" /></el-form-item></el-form><template #footer><div class="flex"><el-button>取消</el-button><el-button type="primary" @click="submitEForm(userForm2)">确定</el-button></div></template></el-dialog></div>
</template>
<script>
import { toRefs, reactive, ref } from "vue";
// import { ArrowRight } from "@element-plus/icons-vue";
export default {name: "userList",setup() {const data = reactive({searchParams: {query: "",pagesize: 5,pagenum: 1,},total: 0,userList: [{username: "谭梦寻",email: "1232412@qq.com",mobile: "123123312312",role_name: "管理员",mg_state: "正常",id: 0,},{username: "江青影",email: "123242312@qq.com",mobile: "12312331231",role_name: "用户",mg_state: "正常",id: 1,},{username: "诸葛亮",email: "1232122@qq.com",mobile: "12312331231",role_name: "用户",mg_state: "正常",id: 2,},{username: "刘伯温",email: "1231232@qq.com",mobile: "12312331231",role_name: "用户",mg_state: "正常",id: 3,},{username: "张角",email: "1231232@qq.com",mobile: "13344431323",role_name: "用户",mg_state: "正常",id: 4,},{username: "刘备",email: "1231232@qq.com",mobile: "13344434343",role_name: "用户",mg_state: "正常",id: 5,},{username: "关羽",email: "1231232@qq.com",mobile: "12542331231",role_name: "用户",mg_state: "正常",id: 6,},{username: "曹操",email: "1231232@qq.com",mobile: "15678331231",role_name: "用户",mg_state: "正常",id: 7,},],users: [],dialogFormVisible: false,dialogFormEVisible: false,formData: {username: "",password: "",email: "",mobile: "",},formData2: {id: "",email: "",mobile: "",},rules: {username: [{ required: true, message: "此项为必填", trigger: "blur" }],password: [{ required: true, message: "此项为必填", trigger: "blur" }],email: [{required: false,pattern:/^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/,message: "请填写正确邮箱",trigger: "blur",},],mobile: [{required: false,pattern: /^[1][2,3,4,5,6,7,8,9][0-9]{9}$/,message: "请填写正确手机号",trigger: "blur",},],},rules2: {email: [{required: false,pattern:/^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/,message: "请填写正确邮箱",trigger: "blur",},],mobile: [{required: false,pattern: /^[1][3,4,5,7,8][0-9]{9}$/,message: "请填写正确手机号",trigger: "blur",},],},});const searchList = () => {// 使用正则表达式进行模糊查询const searchTerm = data.searchParams.query;const regex = new RegExp(searchTerm, "gi");console.log(data.searchParams);data.users = data.userList;data.users = data.users.filter((item) => regex.test(item.username));let len = data.users.length;let num = len - data.searchParams.pagesize;// 获取到的数组长度大于页面展示的长度if (num > 0 && data.searchParams.pagenum === 1) {console.log("展示首页内容!");data.users.splice(data.searchParams.pagesize, num);} else if (num > 0 && data.searchParams.pagenum !== 1) {console.log("展示后面的内容!");console.log("前面要删除的数目:" +(data.searchParams.pagenum - 1) * data.searchParams.pagesize);data.users.splice(0,(data.searchParams.pagenum - 1) * data.searchParams.pagesize);// 二次截断let len2 = data.users.length;data.users.splice(data.searchParams.pagesize,len2 - data.searchParams.pagesize);}data.total = len;};const addUser = () => {data.dialogFormVisible = true;};// 新增提交const submitForm = (formEl) => {// validateformEl.validate((res) => {if (!res) {return;}// 表单通过对象形式新增到数组中// data.userList.push(data.formData);data.users.push(data.formData);// 隐藏弹窗data.dialogFormVisible = false;// 清空formdata.formData = {username: "",password: "",email: "",mobile: "",};});};// 修改提交const submitEForm = (formEl) => {formEl.validate((res) => {if (!res) {return;}// 提交修改console.log(data.formData2);data.users[data.formData2.id].email = data.formData2.email;data.users[data.formData2.id].mobile = data.formData2.mobile;data.dialogFormEVisible = false;searchList();});};// 状态更改const switchChange = (row) => {console.log("操作的那条数据", row);if (row) {searchList();}};// 数据编辑const editRow = (row) => {console.log("编辑的那条数据", row);const { email, mobile, id } = row;// 展示编辑表单data.dialogFormEVisible = true;data.formData2.email = email;data.formData2.mobile = mobile;data.formData2.id = id;};// 删除数据const deleteRow = (row) => {console.log("删除的那条数据", row);let i = 0;console.log(row.email);for (i; i < data.users.length; i++) {if (data.users[i].email === row.email) {data.users.splice(i, 1);}}console.log(data.users);};// 方法初始化searchList();const userForm = ref();const userForm2 = ref();return {...toRefs(data),searchList,addUser,submitForm,submitEForm,userForm,userForm2,// switchChange,editRow,deleteRow,};},
};
</script>
<style scoped>
.input_box {width: 200px;margin-right: 15px;
}
</style>
项目成果图:

总结: 

Element-Plus虽然给我们提供了框架,但是在实际运用时,还需要根据需求来编写代码逻辑,比如我这里用的是虚拟数据,所以需要利用副本来渲染,每一切换页面都要更新副本数据,假如后端直接提供参数来获取对应页数的数据条数,则不需要这样复杂的过程。

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

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

相关文章

实现按块复制元素的进阶技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、按块复制元素的重要性 二、使用LED模块创建数组并复制 三、实现按块复制的具体步骤 四…

群晖NAS使用Docker部署WPS Office结 合内网穿透实现远程编辑本地文档

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本&#xff0c;通过…

基于微信小程序+ JAVA后端实现的【微信小程序跑腿平台】设计与实现 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称&#xff1a; 《微信小程序跑腿平台的设计与实现》 项目技术栈 该项目采用了以下核心技术栈&#xff1a; 后端框架/库&#xff1a; Java, SSM框架数据库&#xff1a; MySQL前端技术&#xff1a; 微信小程序, HTML…&#xff08;其它相关技术&#xff09; …

工作软件新宠儿

想要让你的工作效率飞起来吗&#xff1f;&#x1f440; 是时候告别那些大众化的工作软件啦&#xff01;今天&#xff0c;我要给大家种草几款不常见的但超级实用的工作软件&#x1f331;&#xff0c;保证让你事半功倍哦&#xff01;&#x1f31f; 1️⃣ 亿可达 它是一款自动化…

【NumPy】深入理解NumPy的cov函数:计算协方差矩阵的完整指南

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

ADC模数转换器的简介及参数详解

ADC全称是Analog-to-Digital Converter模数转换器&#xff0c;一般我们把模拟信号(Analog signal) 用A来进行简写&#xff0c;数字信号(digital signal) 用D来表示。是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。 今天我们主要说ADC的参数&#xff0c;我们把…

​你见过哪些不过度设计的优秀APP?​

优联前端https://ufrontend.com/ 提供一站式企业前端解决方案 “每日故宫”是一款以故宫博物院丰富的藏品为基础&#xff0c;结合日历形式展示每日精选藏品的移动应用。通过这款应用&#xff0c;用户可以随时随地欣赏到故宫的珍贵藏品&#xff0c;感受中华五千年文化的魅力。…

算法工程师需要学习C++的哪些知识?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;以下是算法工程师需要学习的一些…

配餐中的红酒温度控制与口感体验

在红酒配餐中&#xff0c;温度控制是影响口感体验的重要因素之一。合适的温度可以释放红酒的香气和风味&#xff0c;使酒体更加圆润和丰富。云仓酒庄雷盛红酒以其卓着的品质和与众不同的口感&#xff0c;成为了红酒爱好者们的首要选择品牌。下面将介绍如何通过温度控制提升红酒…

简单微信企业群消息推送接口

群管理 群发送接口 POST: JSONURL http://localhost:65029/m/wxapi/sendwxmsg{ "nr":"试", --消息 "at":"wxid_y0k4dv0xcav622,wxid_y0k4dv0xcav622",--群wxid "key":"F98F354F1671A2D21BC78C76B95E96EB",--群k…

重庆耶非凡科技有限公司有选品师项目培训吗?

在当今科技飞速发展的时代&#xff0c;各种科技公司如雨后春笋般涌现&#xff0c;它们在不同领域发挥着重要作用。其中&#xff0c;重庆耶非凡科技有限公司以其独特的业务模式和专业服务&#xff0c;在业界赢得了良好的口碑。那么&#xff0c;重庆耶非凡科技有限公司究竟是做什…

JavaScript(ES5) 入门

01-简介 1)JavaScript 发展史 [1] 1995年,navigator(导航者),netscape(网景);用户体验性特别好 [2] 表单验证难题,表单验证都是在后台处理.当时处在网速特别慢的时代,发送一个请求,接收响应 需要5分钟左右的时候提高表单验证的速度,想开发一种语言在前端进行表单验证. [3] 1995…

java高级——String字符串探索(在jvm底层中如何实现,常量池中怎么查看)

java高级——String字符串探索&#xff08;在jvm底层中如何实现&#xff0c;常量池中怎么查看&#xff09; 文章介绍提前了解的知识点1. 常量池2. Jvm虚拟机3. 字节码 String类详解1. String对象在申明后将不可修改&#xff0c;是不可变类2. String进行相加相减等操作时一定会创…

【ARM+Codesys案例】树莓派+Codesys软PLC方案在包装行业灌装旋盖机的应用

ARM系列支持&#xff1a;全志T3、RK3568、树莓派 机型定义&#xff1a;双工位旋盖机 旋盖机主要适用于不同规格的材质及不同规格的盖、旋&#xff08;轧&#xff09;盖。适用螺旋盖、防盗盖、防撞盖、压入盖等。压力可方便调整&#xff0c;根据瓶盖大小设置取盖位。结构紧凑、…

Linux--进程间通信(2)(有名管道)

目录 1.原理 2.创建命名管道 3.使用命名通道实现简单的通信 4.使用创建的命名管道 1.原理 匿名管道没有名称&#xff0c;它们是通过句柄在父进程和子进程之间传递的。这意味着匿名管道只能用于具有父子关系的进程之间。 但如果程序之间没关系&#xff0c;那么这时候就要用…

2024 年“泰迪杯”A 题:生产线的故障自动识别与人员配置--第四题(用遗传算法解决生产线排班问题--matlab代码)

问题背景&#xff1a; 问题四&#xff1a;根据实际情况&#xff0c;现需要扩大生产规模&#xff0c;将生产线每天的运行时间从 8 小时增加 到 24 小时不间断生产&#xff0c;考虑生产线与操作人员的搭配&#xff0c;制定最佳的操作人员排班方案&#xff0c;要求满足以下条件&am…

RedHat9网络配置设计

目录 一、实验目的 二、实验过程 1、配置新网络接口 2、多网卡配置网络 3、网络接口的绑定&#xff0c;进行远程访问 4、配置网络接口的组合 一、实验目的 本次实验的目的是使用nmcli命令工具配置网络&#xff0c;ens160配置多个网卡&#xff0c;进行网络接口的绑定与组合…

Redis 主从搭建简单教程

安装单机 首先拿到安装包 wget https://download.redis.io/releases/redis-7.0.15.tar.gz然后进行解压 tar -zxvf redis-7.0.15.tar.gz 然后创建一个文件夹myredis将原始配置文件进行备份 mkdir /myrediscp redis.conf /myredis/redis7.conf 将配置文件复制进去 最后使用vim编…

室内也可以用北斗定位?还能用RTK?

室内卫星顾名思义&#xff0c;就是在室内有遮挡环境中的卫星定位技术&#xff0c;众所周知&#xff0c;目前全球几大GNSS定位系统已经很完善&#xff0c;但是GNSS有个致命的弱点&#xff0c;就是地面如果有遮挡就没有信号&#xff0c;在这样的条件下&#xff0c;在室内定位场景…

RT_Thread内核源码分析(一)——CM3内核和上下文切换

目录 一、程序存储分析 1.1 CM3内核寻址空间映射 1.2 程序静态存储和动态执行 二、CM3内核相关知识 2.1 操作模式和特权极别 2.2 环境相关寄存器 2.2.1 通用寄存器组&#xff0c; 2.2.2 状态寄存器组 2.2.3 模式切换环境自动保存 2.2.4 函数调用形参位置 2.3 …