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

7.4Element Plus 分页与表格组件

 el-pagination el-table 

这两个组件是后台管理系统中最常用的数据展示与交互组合,通常配合使用实现 分页加载、排序、筛选、操作 等功能。


一、分页组件 el-pagination

用于控制大量数据的分页展示。

✅ 基本结构
<el-paginationv-model:current-page="currentPage"v-model:page-size="pageSize":total="total":page-sizes="[10, 20, 50, 100]"layout="total, sizes, prev, pager, next, jumper"background
/>

🔧 核心属性(Props)
属性类型说明默认值
v-model:current-pagenumber当前页码(双向绑定)1
v-model:page-sizenumber每页条数(双向绑定)10
totalnumber总数据条数0
page-sizesnumber[]每页显示条数选择器选项[10, 20, 30, 40, 50, 100]
layoutstring组件布局,用逗号分隔'prev, pager, next'
backgroundboolean是否为按钮添加背景色false
disabledboolean是否禁用分页false
smallboolean是否使用小型分页false

layout 可选值

  • total: 总条数
  • sizes: 每页条数选择器
  • prev: 上一页
  • pager: 页码列表
  • next: 下一页
  • jumper: 跳转输入框
  • ->: 分隔符(将后续元素推到右侧)

📢 事件(Events)
事件说明回调参数
@size-change每页条数改变时触发改变后的 pageSize
@current-change当前页改变时触发改变后的 currentPage
@prev-click点击上一页时触发-
@next-click点击下一页时触发-

⚠️ 注意:使用 v-model 后,通常只需监听 @size-change@current-change 来重新请求数据。


二、表格组件 el-table

用于展示结构化数据。

✅ 基本结构
<el-table :data="tableData" style="width: 100%"><el-table-column prop="name" label="姓名" /><el-table-column prop="age" label="年龄" />
</el-table>

🔧 表格核心属性(el-table Props)
属性类型说明
dataarray显示的数据源
stripeboolean是否显示斑马纹
borderboolean是否显示纵向边框
fitboolean列宽是否自撑开
heightstring/number固定高度,超出出现滚动条
max-heightstring/number最大高度
highlight-current-rowboolean高亮当前行
empty-textstring数据为空时显示文本
v-loadingboolean是否显示加载中

🔧 列定义 el-table-column 属性
属性类型说明
typestring列类型:selectionindexexpand
labelstring列标题
propstring对应字段名
width / min-widthstring/number列宽
fixedstring/boolean固定列:leftright
sortableboolean/string是否可排序,custom 为自定义
formatterFunction格式化内容函数
show-overflow-tooltipboolean内容过长显示 tooltip
align / header-alignstring对齐方式:leftcenterright

🧩 高级功能
1. 复选框列
<el-table-column type="selection" width="55" />
2. 序号列
<el-table-column type="index" label="序号" width="80" />
3. 可展开行
<el-table-column type="expand"><template #default="props"><p>详情:{{ props.row.detail }}</p></template>
</el-table-column>
4. 自定义列模板
<el-table-column label="操作" width="180"><template #default="{ row }"><el-button size="small" @click="edit(row)">编辑</el-button><el-button size="small" type="danger">删除</el-button></template>
</el-table-column>
5. 排序
<el-table-column prop="age" label="年龄" sortable />
<!-- 或自定义排序 -->
<el-table-column prop="age" label="年龄" sortable="custom" @sort-change="handleSort" />
6. 筛选
<el-table-columnprop="tag"label="标签":filters="[{ text: '家', value: '家' }, { text: '公司', value: '公司' }]":filter-method="filterTag"
/>
function filterTag(value, row) {return row.tag === value
}

三、实战案例(完整)

<script setup>
import { ref, reactive, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'// 响应式数据
const tableData = ref([])
const total = ref(0)
const loading = ref(false)// 分页
const currentPage = ref(1)
const pageSize = ref(10)// 搜索与排序
const searchKey = ref('')
const sortState = reactive({ prop: '', order: '' })// 模拟数据获取
const fetchData = () => {loading.value = truesetTimeout(() => {const allData = Array.from({ length: 100 }, (_, i) => ({id: i + 1,name: `用户${i + 1}`,age: 18 + (i % 50),address: `地址 ${i + 1}`}))// 搜索let filtered = allData.filter(item => item.name.includes(searchKey.value))// 排序if (sortState.prop && sortState.order) {filtered.sort((a, b) => {const diff = a[sortState.prop] - b[sortState.prop]return sortState.order === 'descending' ? -diff : diff})}// 分页const start = (currentPage.value - 1) * pageSize.valueconst end = start + pageSize.valuetableData.value = filtered.slice(start, end)total.value = filtered.lengthloading.value = false}, 500)
}// 事件
const handleSearch = () => {currentPage.value = 1fetchData()
}const handleSortChange = ({ prop, order }) => {sortState.prop = propsortState.order = ordercurrentPage.value = 1fetchData()
}const handleEdit = (row) => ElMessage.info(`编辑:${row.name}`)
const handleDelete = (row) => {ElMessageBox.confirm(`删除 ${row.name}?`, '确认', { type: 'warning' }).then(() => ElMessage.success('删除成功')).catch(() => ElMessage.info('取消'))
}onMounted(() => fetchData())
</script><template><div class="p-4"><div class="flex justify-between mb-4"><h3 class="text-lg font-medium">用户列表</h3><el-input v-model="searchKey" placeholder="搜索姓名" @input="handleSearch" style="width: 240px" /></div><el-table :data="tableData" stripe border v-loading="loading" @sort-change="handleSortChange"><el-table-column type="index" label="序号" width="80" /><el-table-column prop="name" label="姓名" sortable /><el-table-column prop="age" label="年龄" sortable width="100" /><el-table-column prop="address" label="地址" show-overflow-tooltip /><el-table-column label="操作" width="160"><template #default="{ row }"><el-button size="small" @click="handleEdit(row)">编辑</el-button><el-button size="small" type="danger" @click="handleDelete(row)">删除</el-button></template></el-table-column></el-table><el-paginationv-model:current-page="currentPage"v-model:page-size="pageSize":total="total"layout="total, sizes, prev, pager, next, jumper"background@size-change="fetchData"@current-change="fetchData"class="mt-4 justify-end"/></div>
</template>

http://www.xdnf.cn/news/19786.html

相关文章:

  • js设计模式-装饰器模式
  • CI(持续集成)、CD(持续交付/部署)、CT(持续测试)、CICD、CICT
  • Few-Shot Prompting 实战:用5个例子让GPT-4学会复杂任务
  • (二)文件管理-基础命令-cd命令的使用
  • 中州养老:资源添加功能
  • gitlab推送失败,内存不足的处理
  • 深入浅出Spring IoC与DI:设计思想、实现方式与反射技术详解
  • Excel 电影名匹配图片路径教程:自动查找并写入系统全路径
  • PostgreSQL 中唯一索引的工作原理
  • 分布式AI算力系统番外篇-----超体的现实《星核》
  • Vue基础知识-重要的内置关系:vc实例.__proto__.__proto__ === Vue.prototype
  • 股指期货可以通过移仓长线持有吗?
  • AppInventor2 如何自定义包名?
  • 华为云云原生架构赋能:大腾智能加速业务创新步伐
  • 【深度学习新浪潮】视觉大模型在预训练方面有哪些关键进展?
  • 鸿蒙UI开发实战:解决布局错乱与响应异常
  • 企业实用——MySQL的备份详解
  • 基于机器学习的Backtrader波动性预测与管理
  • Kubernetes ConfigMap 更新完整指南:原理、方法与最佳实践
  • PyTorch实战——ResNet与DenseNet详解
  • Huggingface终于没忍住,OpenCSG坚持开源开放
  • flume拓扑结构详解:从简单串联到复杂聚合的完整指南
  • Linux 的信号 和 Qt 的信号
  • IO_HW_9_3
  • MySQL数据库恢复步骤(基于全量备份和binlog)
  • 揭秘ArrowJava核心:IndexSorter高效排序设计
  • Cookie、Session、登录
  • 一个工业小白眼中的 IT/OT 融合真相:数字化工厂的第一课
  • SQL Server核心架构深度解析
  • AlexNet:计算机视觉的革命性之作