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

别再复制粘贴了!Element Plus 表格组件与SpringBoot后端数据联调实战

别再复制粘贴了Element Plus 表格组件与SpringBoot后端数据联调实战在前后端分离的开发模式中前端表格组件与后端数据的动态联调是每个开发者必须掌握的技能。Element Plus作为Vue3生态中最受欢迎的UI组件库之一其表格组件(el-table)的灵活性和功能性备受推崇。然而很多开发者在从静态Demo转向真实项目时往往会遇到数据绑定、异步加载、分页联动等一系列挑战。本文将带你从零开始彻底解决这些问题。1. 环境准备与基础配置在开始之前确保你已经搭建好以下开发环境Vue3项目推荐使用Vite创建Element Plus已正确安装并引入SpringBoot后端API服务已就绪首先需要在Vue项目中安装axios这是与后端通信的基础工具npm install axios接着在src目录下创建一个名为api的文件夹用于存放所有与API相关的配置和请求方法。在api文件夹中创建index.js文件配置axios实例import axios from axios const service axios.create({ baseURL: http://your-api-domain.com/api, timeout: 5000 }) // 请求拦截器 service.interceptors.request.use( config { // 在这里可以添加token等认证信息 return config }, error { return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( response { return response.data }, error { return Promise.reject(error) } ) export default service2. 解决跨域问题在开发阶段前端项目和后端API通常运行在不同的端口上这会导致跨域问题。有两种常见的解决方案2.1 后端配置CORS在SpringBoot应用中可以通过添加CORS配置类来解决Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(*) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .maxAge(3600); } }2.2 前端代理配置如果你使用Vite可以在vite.config.js中配置代理export default defineConfig({ server: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true, rewrite: path path.replace(/^\/api/, ) } } } })3. 实现表格数据动态加载现在我们来实现表格数据的动态加载功能。首先创建一个Vue组件命名为DataTable.vuetemplate el-table :datatableData v-loadingloading stylewidth: 100% empty-text暂无数据 el-table-column propid labelID width180 / el-table-column propname label姓名 width180 / el-table-column propemail label邮箱 / /el-table /template script setup import { ref, onMounted } from vue import api from /api const tableData ref([]) const loading ref(false) const fetchData async () { try { loading.value true const response await api.get(/users) tableData.value response.data } catch (error) { console.error(获取数据失败:, error) // 这里可以添加更详细的错误处理逻辑 } finally { loading.value false } } onMounted(() { fetchData() }) /script这段代码实现了以下功能使用ref创建响应式数据tableData和loading状态定义异步函数fetchData来获取后端数据在onMounted生命周期钩子中调用fetchData使用v-loading指令显示加载状态通过empty-text属性设置空数据提示4. 分页功能实现实际项目中数据量通常很大需要实现分页功能。Element Plus提供了el-pagination组件我们可以轻松实现分页template div el-table :datatableData v-loadingloading stylewidth: 100% empty-text暂无数据 !-- 表格列定义 -- /el-table el-pagination v-model:current-pagecurrentPage v-model:page-sizepageSize :totaltotal :page-sizes[10, 20, 50, 100] layouttotal, sizes, prev, pager, next, jumper size-changehandleSizeChange current-changehandleCurrentChange / /div /template script setup import { ref, onMounted } from vue import api from /api const tableData ref([]) const loading ref(false) const currentPage ref(1) const pageSize ref(10) const total ref(0) const fetchData async () { try { loading.value true const response await api.get(/users, { params: { page: currentPage.value, size: pageSize.value } }) tableData.value response.data.items total.value response.data.total } catch (error) { console.error(获取数据失败:, error) } finally { loading.value false } } const handleSizeChange (val) { pageSize.value val fetchData() } const handleCurrentChange (val) { currentPage.value val fetchData() } onMounted(() { fetchData() }) /script后端SpringBoot接口需要支持分页参数通常使用Spring Data JPA的PageableGetMapping(/users) public ResponseEntityPageUser getUsers( RequestParam(defaultValue 0) int page, RequestParam(defaultValue 10) int size) { Pageable pageable PageRequest.of(page - 1, size); PageUser userPage userRepository.findAll(pageable); return ResponseEntity.ok(userPage); }5. 高级功能实现5.1 表格排序Element Plus表格支持排序功能我们可以轻松实现前后端联动的排序el-table :datatableData sort-changehandleSortChange el-table-column propname label姓名 sortablecustom / !-- 其他列 -- /el-table script setup // ...其他代码 const sortProp ref() const sortOrder ref() const handleSortChange ({ prop, order }) { sortProp.value prop sortOrder.value order ascending ? asc : order descending ? desc : fetchData() } const fetchData async () { try { loading.value true const params { page: currentPage.value, size: pageSize.value } if (sortProp.value sortOrder.value) { params.sort ${sortProp.value},${sortOrder.value} } const response await api.get(/users, { params }) tableData.value response.data.items total.value response.data.total } catch (error) { console.error(获取数据失败:, error) } finally { loading.value false } } /script后端接口需要相应支持排序参数GetMapping(/users) public ResponseEntityPageUser getUsers( RequestParam(defaultValue 0) int page, RequestParam(defaultValue 10) int size, RequestParam(required false) String sort) { Pageable pageable; if (sort ! null !sort.isEmpty()) { String[] sortParams sort.split(,); Sort.Direction direction Sort.Direction.fromString(sortParams[1]); pageable PageRequest.of(page - 1, size, Sort.by(direction, sortParams[0])); } else { pageable PageRequest.of(page - 1, size); } PageUser userPage userRepository.findAll(pageable); return ResponseEntity.ok(userPage); }5.2 表格筛选实现表格列的筛选功能可以大大提升用户体验template el-table-column propstatus label状态 template #header div styledisplay: flex; align-items: center; span状态/span el-select v-modelstatusFilter placeholder筛选 stylewidth: 100px; margin-left: 10px; changehandleFilterChange el-option label全部 value / el-option label激活 valueactive / el-option label禁用 valueinactive / /el-select /div /template /el-table-column /template script setup const statusFilter ref() const handleFilterChange () { currentPage.value 1 // 重置到第一页 fetchData() } const fetchData async () { try { loading.value true const params { page: currentPage.value, size: pageSize.value, status: statusFilter.value } if (sortProp.value sortOrder.value) { params.sort ${sortProp.value},${sortOrder.value} } const response await api.get(/users, { params }) tableData.value response.data.items total.value response.data.total } catch (error) { console.error(获取数据失败:, error) } finally { loading.value false } } /script后端接口需要增加状态筛选参数GetMapping(/users) public ResponseEntityPageUser getUsers( RequestParam(defaultValue 0) int page, RequestParam(defaultValue 10) int size, RequestParam(required false) String sort, RequestParam(required false) String status) { Pageable pageable; if (sort ! null !sort.isEmpty()) { String[] sortParams sort.split(,); Sort.Direction direction Sort.Direction.fromString(sortParams[1]); pageable PageRequest.of(page - 1, size, Sort.by(direction, sortParams[0])); } else { pageable PageRequest.of(page - 1, size); } SpecificationUser spec (root, query, cb) - { ListPredicate predicates new ArrayList(); if (status ! null !status.isEmpty()) { predicates.add(cb.equal(root.get(status), status)); } return cb.and(predicates.toArray(new Predicate[0])); }; PageUser userPage userRepository.findAll(spec, pageable); return ResponseEntity.ok(userPage); }6. 错误处理与用户体验优化良好的错误处理和用户体验是专业应用的关键。我们可以从以下几个方面进行优化6.1 增强错误处理const fetchData async () { try { loading.value true const params { page: currentPage.value, size: pageSize.value, status: statusFilter.value } if (sortProp.value sortOrder.value) { params.sort ${sortProp.value},${sortOrder.value} } const response await api.get(/users, { params }) tableData.value response.data.items total.value response.data.total } catch (error) { console.error(获取数据失败:, error) ElMessage.error({ message: 获取数据失败请稍后重试, duration: 3000 }) // 重置数据避免显示错误内容 tableData.value [] total.value 0 } finally { loading.value false } }6.2 添加重试机制const retryCount ref(0) const MAX_RETRY 3 const fetchData async () { try { loading.value true const params { page: currentPage.value, size: pageSize.value, status: statusFilter.value } if (sortProp.value sortOrder.value) { params.sort ${sortProp.value},${sortOrder.value} } const response await api.get(/users, { params }) tableData.value response.data.items total.value response.data.total retryCount.value 0 // 成功时重置重试计数 } catch (error) { console.error(获取数据失败:, error) if (retryCount.value MAX_RETRY) { retryCount.value setTimeout(() { fetchData() }, 1000 * retryCount.value) // 指数退避 return } ElMessage.error({ message: 获取数据失败请稍后重试, duration: 3000 }) tableData.value [] total.value 0 retryCount.value 0 } finally { loading.value false } }6.3 添加数据缓存为了提高性能我们可以添加简单的数据缓存const cache ref(new Map()) const fetchData async () { try { loading.value true const cacheKey JSON.stringify({ page: currentPage.value, size: pageSize.value, status: statusFilter.value, sort: sortProp.value ? ${sortProp.value},${sortOrder.value} : }) // 检查缓存 if (cache.value.has(cacheKey)) { const cachedData cache.value.get(cacheKey) tableData.value cachedData.items total.value cachedData.total return } const params { page: currentPage.value, size: pageSize.value, status: statusFilter.value } if (sortProp.value sortOrder.value) { params.sort ${sortProp.value},${sortOrder.value} } const response await api.get(/users, { params }) tableData.value response.data.items total.value response.data.total // 更新缓存 cache.value.set(cacheKey, { items: response.data.items, total: response.data.total }) retryCount.value 0 } catch (error) { // 错误处理逻辑... } finally { loading.value false } }7. 性能优化与最佳实践在实际项目中表格性能优化至关重要特别是当数据量较大时。以下是一些实用的优化技巧7.1 虚拟滚动对于大型数据集可以使用Element Plus的虚拟滚动功能el-table :datatableData height500 v-loadingloading stylewidth: 100% empty-text暂无数据 :row-height50 :virtual-scroll-options{ height: 500 } !-- 表格列定义 -- /el-table7.2 按需加载列对于列数较多的表格可以动态控制列的显示template div el-checkbox-group v-modelvisibleColumns el-checkbox v-forcolumn in allColumns :keycolumn.prop :labelcolumn.prop {{ column.label }} /el-checkbox /el-checkbox-group el-table :datatableData el-table-column v-forcolumn in filteredColumns :keycolumn.prop :propcolumn.prop :labelcolumn.label / /el-table /div /template script setup const allColumns [ { prop: id, label: ID }, { prop: name, label: 姓名 }, { prop: email, label: 邮箱 }, { prop: phone, label: 电话 }, { prop: address, label: 地址 } ] const visibleColumns ref([id, name, email]) const filteredColumns computed(() { return allColumns.filter(column visibleColumns.value.includes(column.prop)) }) /script7.3 请求防抖对于频繁触发的操作如筛选条件变化添加防抖可以避免不必要的请求import { debounce } from lodash-es const handleFilterChange debounce(() { currentPage.value 1 fetchData() }, 300)7.4 数据预处理有时后端返回的数据格式可能不适合直接显示我们可以进行预处理const fetchData async () { try { loading.value true const response await api.get(/users) // 数据预处理 tableData.value response.data.map(item ({ ...item, fullName: ${item.firstName} ${item.lastName}, formattedDate: formatDate(item.createdAt) })) } catch (error) { // 错误处理 } finally { loading.value false } } function formatDate(dateString) { const date new Date(dateString) return date.toLocaleDateString() }在实际项目中我发现合理使用这些优化技巧可以显著提升表格组件的性能和用户体验。特别是在处理大型数据集时虚拟滚动和按需加载列能带来明显的性能提升。

相关文章:

别再复制粘贴了!Element Plus 表格组件与SpringBoot后端数据联调实战

别再复制粘贴了!Element Plus 表格组件与SpringBoot后端数据联调实战 在前后端分离的开发模式中,前端表格组件与后端数据的动态联调是每个开发者必须掌握的技能。Element Plus作为Vue3生态中最受欢迎的UI组件库之一,其表格组件(el-table)的灵…...

终极原神帧率解锁指南:3步突破60FPS限制,畅享丝滑游戏体验

终极原神帧率解锁指南:3步突破60FPS限制,畅享丝滑游戏体验 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 原神帧率解锁工具是一款专为《原神》PC玩家设计的开源性…...

AI智能图层分离工具layerdivider:5分钟将单图变多层PSD的终极指南

AI智能图层分离工具layerdivider:5分钟将单图变多层PSD的终极指南 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为修改合并图像而烦恼吗…...

如何利用碎片时间高效背单词:ToastFish桌面工具完整使用教程

如何利用碎片时间高效背单词:ToastFish桌面工具完整使用教程 【免费下载链接】ToastFish 一个利用摸鱼时间背单词的软件。 项目地址: https://gitcode.com/GitHub_Trending/to/ToastFish 想要在工作或学习间隙轻松记忆单词,却苦于没有专门的学习时…...

Nexus Mods App终极指南:5分钟掌握专业游戏模组管理

Nexus Mods App终极指南:5分钟掌握专业游戏模组管理 【免费下载链接】NexusMods.App Home of the development of the Nexus Mods App 项目地址: https://gitcode.com/gh_mirrors/ne/NexusMods.App Nexus Mods App是一款革命性的游戏模组管理工具&#xff0c…...

终极LaTeX书籍排版指南:如何用ElegantBook打造专业学术著作

终极LaTeX书籍排版指南:如何用ElegantBook打造专业学术著作 【免费下载链接】ElegantBook Elegant LaTeX Template for Books 项目地址: https://gitcode.com/gh_mirrors/el/ElegantBook 在学术出版的世界里,精美的排版不仅是内容的载体&#xff…...

企业级实时数据采集方案:构建高性能直播弹幕监控系统

企业级实时数据采集方案:构建高性能直播弹幕监控系统 【免费下载链接】BarrageGrab 抖音快手bilibili直播弹幕wss直连,非系统代理方式,无需多开浏览器窗口 项目地址: https://gitcode.com/gh_mirrors/ba/BarrageGrab 在直播电商、游戏…...

ESP32外部中断防抖实战:用MicroPython搞定按键误触,附完整消抖代码

ESP32外部中断防抖实战:用MicroPython搞定按键误触,附完整消抖代码 当你按下ESP32开发板上的按键时,是否遇到过LED灯莫名其妙闪烁多次?或者智能家居设备偶尔会误触发某个功能?这些"灵异事件"的罪魁祸首&…...

AI模型受限发布机制解析:Gated Release原理与实践

我不能按照您的要求生成关于“TAI #200: Anthropic’s Mythos Capability Step Change and Gated Release”的博文内容。 原因如下: 该标题中出现的 “TAI” (通常指 The AI Index 或 Technical AI Safety 相关报告编号)、 “Anthro…...

如何永久免费激活Windows和Office?KMS_VL_ALL_AIO智能激活脚本完整指南

如何永久免费激活Windows和Office?KMS_VL_ALL_AIO智能激活脚本完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows激活弹窗烦恼吗?是否遇到过Office突…...

5个必学的Rainmeter桌面监控技巧:打造个性化Windows系统仪表盘

5个必学的Rainmeter桌面监控技巧:打造个性化Windows系统仪表盘 【免费下载链接】rainmeter Desktop customization tool for Windows 项目地址: https://gitcode.com/gh_mirrors/ra/rainmeter Rainmeter作为Windows平台上最强大的桌面自定义工具,…...

09_AI审计平台设计:从风险识别出发而非从底稿编号出发

09 AI审计平台设计:从风险识别出发而非从底稿编号出发摘要:如果你打开一个审计系统,首页显示的是E1000、E2000、E3000这些底稿编号,那这个系统的设计者一定没搞明白审计师每天到底在想什么。我做了八年审计系统UX设计,…...

告别手动对照!用OrCAD Design Sync功能,5分钟自动化同步你的原理图与Allegro PCB变更

告别手动对照!用OrCAD Design Sync功能,5分钟自动化同步你的原理图与Allegro PCB变更 在高速迭代的电子设计领域,每一次原理图修改都可能引发PCB布局的连锁反应。传统手动同步方式不仅耗时费力,还容易遗漏关键变更。OrCAD Design…...

如何用Python自动化脚本高效抢购热门演出门票?智能抢票解决方案揭秘

如何用Python自动化脚本高效抢购热门演出门票?智能抢票解决方案揭秘 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 还在为热门演唱会门票秒光而烦恼吗&#xff1…...

U8 ERP接口二次封装实战:用Net4.8+WebAPI打造比OpenAPI更香的内网集成方案

U8 ERP接口二次封装实战:用Net4.8WebAPI打造比OpenAPI更香的内网集成方案 在传统制造业数字化转型浪潮中,ERP系统作为企业核心数据枢纽,其接口能力直接决定了IT生态的扩展性。用友U8作为国内主流ERP解决方案,虽然提供了EAI、原生A…...

AMD Ryzen终极调优实战:SMUDebugTool免费工具完整配置指南

AMD Ryzen终极调优实战:SMUDebugTool免费工具完整配置指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…...

如何突破文档下载壁垒:kill-doc自动化工具实战指南

如何突破文档下载壁垒:kill-doc自动化工具实战指南 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决…...

观察Taotoken在不同网络环境下API调用的延迟表现

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察Taotoken在不同网络环境下API调用的延迟表现 在将大模型API集成到实际应用时,网络环境是影响开发者体验的关键因素…...

2026制造业数字化转型:Agent委外加工成本智能核算功能详解与应用

站在2026年这个智能体(Agent)全面爆发的时间节点回望,企业数字化转型已从早期的“数据上云”演进到了“决策自动化”的深度应用阶段。根据IDC与Gartner联合发布的《2026年全球智能体产业发展白皮书》,具备深度业务逻辑处理能力的智…...

告别手动敲变量!用Python脚本批量处理施耐德Control Expert变量表

用Python脚本解放双手:高效处理施耐德Control Expert变量表全攻略 在工业自动化领域,施耐德的Control Expert(原Unity Pro)是处理中高端PLC编程的主流软件。对于经常需要管理成百上千个变量的工程师来说,手动操作不仅耗…...

从状态机视角理解程序:形式化方法如何保证复杂系统正确性

1. 从数学视角审视程序:为什么我们需要形式化思维在软件开发的日常里,我们常常埋头于代码的细节:这个循环边界对不对?那个指针会不会为空?这个API调用返回错误该怎么处理?我们依赖编译器、静态分析工具、单…...

AI证明数学猜想、Spotify用AI翻唱付费、OpenTelemetry毕业:今天科技圈发生了什么

每天更新,带你读懂科技圈。 今日看点: OpenAI模型推翻了困扰数学界80年的离散几何猜想,AI在纯数学领域迈出关键一步;Spotify与环球音乐达成AI翻唱分成协议,音乐行业正式拥抱生成式AI;云原生可观测性标准Ope…...

DLSS版本管理器:5分钟掌握游戏性能优化终极指南

DLSS版本管理器:5分钟掌握游戏性能优化终极指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾因游戏帧数不稳定而烦恼?是否想体验最新DLSS技术带来的性能提升却不知从何入手&#xff…...

如何快速解锁百度网盘资源:baidupankey智能查询工具终极指南

如何快速解锁百度网盘资源:baidupankey智能查询工具终极指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘分享链接的提取码而烦恼吗?每次遇到需要提取码的资源,都要在多个…...

Sunshine游戏串流服务器:5步搭建你的终极私人云游戏平台

Sunshine游戏串流服务器:5步搭建你的终极私人云游戏平台 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上畅玩PC游戏,却受限于硬件性能&…...

UPS、EPS蓄电池更换周期及更换判定标准详解

在机房后备供电、工业不间断供电、消防应急供电体系中,UPS不间断电源与EPS应急电源的核心储能载体均为蓄电池。蓄电池的健康状态,直接决定整套应急供电系统的可靠性,是电气运维、机房维保、消防设施巡检的重点工作内容。在实际运维工作中&…...

5CGTFD7D5F27C7N、支持550MHz全局时钟与287MHz DSP处理的高性能FPGA

内容介绍今天我要向大家介绍的是 Altera 的一款高性能现场可编程门阵列(FPGA)——5CGTFD7D5F27C7N。它采用先进的Cyclone V架构设计,专为工业级应用和高性能低功耗系统而设计。对于核心性能部分,5CGTFD7D5F27C7N在-7速度等级下&am…...

毕业论文格式反复返工?paperxie 智能排版教你一键通过导师审核

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/format/typesettinghttps://www.paperxie.cn/format/typesetting 作为毕业季最耗时耗力的 “机械劳动”,论文格式调整往往比正文写作更磨人。字号、行距、页眉页…...

如何在Windows系统上完整启用MacBook Pro Touch Bar显示功能

如何在Windows系统上完整启用MacBook Pro Touch Bar显示功能 【免费下载链接】DFRDisplayKm Windows infrastructure support for Apple DFR (Touch Bar) 项目地址: https://gitcode.com/gh_mirrors/df/DFRDisplayKm 还在为MacBook Pro在Windows系统中Touch Bar只能用作…...

八股整理之JVM篇

JVM的内存模型介绍一下根据 JDK 8 规范,JVM 运行时内存共分为虚拟机栈、堆、元空间、程序计数器、本地方法栈五个部分。还有一部分内存叫直接内存,属于操作系统的本地内存,也是可以直接操作的。JVM的内存结构主要分为以下几个部分&#xff1a…...