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

Vue3 封装el-table组件

封装一个el-table组件:子组件仅负责事件触发,业务逻辑(如API调用、状态更新)由父组件实现

<template><el-table:data="tableData"borderstripestyle="width: 100%; height: calc(100% - 32px);"class="data-table"><!-- 设备类型列 --><el-table-column prop="name" label="设备类型" width="150"><template #default="{ row }"><el-text>{{ row.name }}</el-text></template></el-table-column><!-- 价格列 --><el-table-column prop="price" label="价格" width="100"><template #default="{ row }"><el-text>{{ row.price }}</el-text></template></el-table-column><!-- 电脑SN--><el-table-column prop="sn" label="电脑SN" width="220"><template #default="{ row }"><el-text type="info" copyable>{{ row.sn }}</el-text></template></el-table-column><!-- 供应商列(带筛选) --><el-table-columnprop="supplier"label="供应商"width="120":filters="filters.supplier":filter-method="filterData"><template #default="{ row }"><el-tag effect="plain" :type="supplierTagType[row.supplier]">{{ row.supplier }}</el-tag></template></el-table-column><!-- 入库日期列 --><el-table-column prop="storageDate" label="入库日期" width="150"><template #default="{ row }">{{ formatDate(row.storageDate) }}</template></el-table-column><!-- 地区列(带筛选) --><el-table-columnprop="region"label="地区"width="100":filters="filters.region":filter-method="filterData"><template #default="{ row }"><el-tag effect="plain">{{ row.region }}</el-tag></template></el-table-column><!-- 备注列 --><el-table-column prop="remark" label="备注" min-width="200"></el-table-column><!-- 操作列 --><el-table-column label="操作" width="180" fixed="right"><template #default="{ row }"><el-button type="primary" size="small" @click="handleEdit(row)"><el-icon><Edit /></el-icon>修改</el-button><el-button type="danger" size="small" @click="handleDelete(row)"><el-icon><Delete /></el-icon>删除</el-button></template></el-table-column></el-table>
</template><script setup>
import { defineProps, defineEmits } from 'vue'
import { Edit, Delete } from '@element-plus/icons-vue'
import dayjs from 'dayjs'const props = defineProps({tableData: {type: Array,required: true,default: () => []},filters: {type: Object,required: true,default: () => ({})},supplierTagType: {type: Object,required: true,default: () => ({})}
})const emit = defineEmits(['edit', 'delete'])// 日期格式化
function formatDate(date) {return date ? dayjs(date).format('YYYY-MM-DD') : dayjs().format('YYYY-MM-DD')
}// 筛选方法
const filterData = (value, row, column) => {return row[column.property] === value
}// 操作事件转发
const handleEdit = (row) => {emit('edit', row)
}
const handleDelete = (row) => {emit('delete', row)
}
</script><style scoped>
.data-table {margin-top: 20px;
}
</style>

在父组件中使用这个组件,并给他传值:

<BillTable:table-data="tableData":filters="filters":supplier-tag-type="supplierTagType"@edit="handleEdit"@delete="handleDelete"/>

代码解释:
通过:data="tableData"将数组数据与表格绑定
通过:filters和:filter-method实现筛选功能,数据匹配逻辑在filterData方法中定义
声明组件props的语法,通过defineProps函数定义组件需要接收的三个属性
emit方法‌属于Vue 3的setup语法糖,通过defineEmits声明后使用,用于子组件向父组件跨层级通信

http://www.lryc.cn/news/2393735.html

相关文章:

  • Python爬虫实战:研究Requests-HTML库相关技术
  • Azure Devops pipeline 技巧和最佳实践
  • 云原生应用架构设计原则与落地实践:从理念到方法论
  • 一起学数据结构和算法(三)| 字符串(线性结构)
  • udp 传输实时性测量
  • 超级对话:大跨界且大综合的学问融智学应用场景述评(不同第三方的回应)之一
  • 【ArcGIS微课1000例】0147:Geographic Imager6.2下载安装教程
  • Android 之 kotlin 语言学习笔记二(编码标准)
  • 华为OD机试真题——Boss的收入(分销网络提成计算)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 微软云如何申请使用
  • 历年西北工业大学计算机保研上机真题
  • 使用pnpm、vite搭建Phaserjs的开发环境
  • intra-mart执行java方法笔记
  • 在 Vue 2中使用 dhtmlxGantt 7.1.13组件,并解决使用时遇到的问题汇总.“dhtmlx-gantt“: “^7.1.13“,
  • 【C++高级主题】命令空间(三):未命名的命名空间
  • 鸿蒙OSUniApp 开发支持图片和视频的多媒体展示组件#三方框架 #Uniapp
  • VoltAgent 是一个开源 TypeScript 框架,用于构建和编排 AI 代理
  • 数据中台(大数据平台)之数据仓库建设
  • 如何使用DeepSpeed来训练大模型
  • 道可云人工智能每日资讯|《北京市人工智能赋能新型工业化行动方案(2025年)》发布
  • Unity 中实现首尾无限循环的 ListView
  • mongodb集群之副本集
  • 基于微服务架构的社交学习平台WEB系统的设计与实现
  • window10下docker方式安装dify步骤
  • Spark SQL进阶:解锁大数据处理的新姿势
  • 放假带出门的充电宝买哪种好用耐用?倍思超能充35W了解一下!
  • 云原生DMZ架构实战:基于AWS CloudFormation的安全隔离区设计
  • 小工具合集
  • AI智能体策略FunctionCalling和ReAct有什么区别?
  • 改进自己的图片 app