尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Ruoyi+Vue2分页实现方案详解与选型指南

Ruoyi+Vue2分页实现方案详解与选型指南 1. 项目概述在Web应用开发中数据分页是一个基础但至关重要的功能。作为一名长期使用Ruoyi框架的前端开发者我发现很多新手在面对分页需求时常常感到困惑。本文将基于RuoyiVue2技术栈通过三个实际Demo来详细解析不分页、前端分页和后端分页的实现方式及其适用场景。提示本文所有示例代码都已在Ruoyi 3.8.5 Vue 2.6.14环境下验证通过2. 核心概念解析2.1 分页的本质与价值分页的核心目的是解决大数据量展示的性能和用户体验问题。想象一下图书馆的书架——如果所有书籍都堆在一个架子上找书会非常困难。分页就像把书籍分类放到不同架子上既减轻了单次加载压力又方便用户定位内容。2.2 Ruoyi框架的分页组件Ruoyi内置的pagination组件是基于Element UI的二次封装提供了开箱即用的分页功能。其核心props包括total: 数据总数page.sync: 当前页码双向绑定limit.sync: 每页条数双向绑定pagination: 页码变化时的回调事件3. 不分页实现方案3.1 适用场景分析当数据量较小通常100条且数据结构简单时一次性加载所有数据是最直接的方案。典型场景包括管理系统中的配置项列表用户数量较少的企业内部系统需要频繁过滤、排序的静态数据3.2 代码实现详解template div classapp-container el-card h3Demo 1不分页一次性加载所有数据/h3 el-table :datatableData border stripe sizemini el-table-column propid labelID width80 / el-table-column propname label名称 / el-table-column propage label年龄 / /el-table /el-card /div /template script export default { name: NoPaginationDemo, data() { return { tableData: [] }; }, created() { // 模拟后端一次性返回所有数据 this.tableData Array.from({ length: 20 }).map((_, i) ({ id: i 1, name: 用户- (i 1), age: 20 (i % 10) })); } }; /script3.3 优缺点对比优势实现简单无需处理分页逻辑前端操作排序、过滤响应即时减少HTTP请求次数劣势数据量大时首次加载慢内存占用高移动端体验差注意事项即使采用不分页方案也建议添加虚拟滚动或懒加载优化大列表渲染性能4. 前端分页实现方案4.1 技术原理剖析前端分页的核心逻辑是首次请求获取全部数据根据当前页码和每页条数计算切片范围使用数组的slice方法截取当前页数据4.2 完整实现代码template div classapp-container el-card h3Demo 2前端分页数据只请求一次/h3 el-table :datapageData border stripe sizemini el-table-column propid labelID width80 / el-table-column propname label名称 / el-table-column propage label年龄 / /el-table pagination v-showtotal 0 :totaltotal :page.syncpageNum :limit.syncpageSize paginationhandlePageChange / /el-card /div /template script export default { name: FrontendPaginationDemo, data() { return { allData: [], // 后端返回的全部数据 pageData: [], // 当前页数据 total: 0, pageNum: 1, pageSize: 5 }; }, created() { this.loadAllData(); }, methods: { loadAllData() { // 实际项目中替换为API调用 this.allData Array.from({ length: 23 }).map((_, i) ({ id: i 1, name: 用户- (i 1), age: 18 (i % 15) })); this.total this.allData.length; this.refreshPage(); }, refreshPage() { const start (this.pageNum - 1) * this.pageSize; const end start this.pageSize; this.pageData this.allData.slice(start, end); }, handlePageChange({ page, limit }) { this.pageNum page; this.pageSize limit; this.refreshPage(); } } }; /script4.3 性能优化技巧内存管理对于超大数据集1万条考虑使用Web Worker处理分页计算本地缓存配合localStorage存储已加载数据防抖处理快速翻页时合并请求实测数据在1万条数据量下前端分页的翻页响应时间50ms5. 后端分页实现方案5.1 架构设计思路后端分页是生产环境最常用的方案其核心流程为前端传递pageNum和pageSize参数后端执行SQL分页查询LIMIT/OFFSET返回当前页数据及总数前端更新表格和分页器5.2 Ruoyi标准实现template div classapp-container el-card h3Demo 3后端分页每次翻页请求接口/h3 el-table :datatableData border stripe sizemini v-loadingloading el-table-column propid labelID width80 / el-table-column propname label名称 / el-table-column propage label年龄 / /el-table pagination v-showtotal 0 :totaltotal :page.syncqueryParams.pageNum :limit.syncqueryParams.pageSize paginationgetList / /el-card /div /template script export default { name: BackendPaginationDemo, data() { return { loading: false, tableData: [], total: 0, queryParams: { pageNum: 1, pageSize: 5 } }; }, created() { this.getList(); }, methods: { async getList() { this.loading true; try { // 实际项目替换为API调用 // const res await listUser(this.queryParams) // this.tableData res.rows // this.total res.total // 模拟接口返回 const allData Array.from({ length: 42 }).map((_, i) ({ id: i 1, name: 用户- (i 1), age: 20 (i % 10) })); const { pageNum, pageSize } this.queryParams; const start (pageNum - 1) * pageSize; const end start pageSize; this.tableData allData.slice(start, end); this.total allData.length; } finally { this.loading false; } } } }; /script5.3 高级实践技巧参数扩展在queryParams中添加排序字段和过滤条件请求优化使用axios取消机制避免快速翻页时的请求堆积缓存策略对第一页数据实施短期缓存6. 三种方案的对比与选型6.1 性能对比表指标不分页前端分页后端分页首次加载时间长中等短翻页响应速度无快中等服务器压力高中等低内存占用高高低数据实时性高低高6.2 选型决策树数据量100 → 不分页100数据量5000且需要快速响应 → 前端分页数据量5000或需要实时数据 → 后端分页需要复杂过滤/排序 → 后端分页7. 常见问题排查7.1 分页组件不显示可能原因total值未正确设置或为0未正确引入pagination组件父容器有v-if条件限制解决方案// 确保total在数据加载后更新 this.total response.data.total || 07.2 页码跳转异常典型表现点击页码后数据不更新页码显示不正确调试步骤检查pagination事件绑定确认page.sync和limit.sync的双向绑定查看网络请求参数7.3 性能优化实战对于10万数据量的优化方案后端使用游标分页替代LIMIT/OFFSET前端添加防抖和loading状态实现数据预加载8. 工程化建议8.1 分页逻辑封装建议将分页逻辑抽象为mixin// paginationMixin.js export default { data() { return { pageSizes: [5, 10, 20, 50], pagination: { page: 1, size: 10, total: 0 } } }, methods: { handlePaginationChange(pagination) { this.pagination { ...this.pagination, ...pagination } this.loadData() } } }8.2 API层统一处理建议后端统一返回格式{ code: 200, data: { rows: [], total: 100 } }在Ruoyi中可以通过修改src/utils/request.js实现自动处理9. 扩展思考9.1 无限滚动方案对于移动端优先的应用可以考虑替换分页器为无限滚动window.addEventListener(scroll, () { if (window.innerHeight window.scrollY document.body.offsetHeight - 500) { if (!this.loading this.hasMore) { this.loadNextPage() } } })9.2 虚拟分页技术超大数据集10万建议使用虚拟滚动库npm install vue-virtual-scroller实现原理只渲染可视区域内的DOM元素10. 最佳实践总结经过多个Ruoyi项目的实战验证我的分页方案选型建议是管理后台默认采用后端分页配合查询表单配置页面不分页前端过滤移动端H5无限滚动骨架屏报表系统前端分页导出全部关键经验分页不是独立功能需要与过滤、排序、导出等特性协同设计。在Ruoyi项目中合理使用Element UI的table和pagination组件组合可以节省至少30%的开发时间。
返回列表