云计算百科
云计算领域专业知识百科平台

Vue3 封装el-table组件

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

<template>
<eltable
:data="tableData"
border
stripe
style="width: 100%; height: calc(100% – 32px);"
class="data-table"
>
<! 设备类型列 >
<eltablecolumn prop="name" label="设备类型" width="150">
<template #default="{ row }">
<eltext>{{ row.name }}</eltext>
</template>
</eltablecolumn>

<! 价格列 >
<eltablecolumn prop="price" label="价格" width="100">
<template #default="{ row }">
<eltext>{{ row.price }}</eltext>
</template>
</eltablecolumn>

<! 电脑SN>
<eltablecolumn prop="sn" label="电脑SN" width="220">
<template #default="{ row }">
<eltext type="info" copyable>{{ row.sn }}</eltext>
</template>
</eltablecolumn>

<! 供应商列(带筛选) >
<eltablecolumn
prop="supplier"
label="供应商"
width="120"
:filters="filters.supplier"
:filtermethod="filterData"
>
<template #default="{ row }">
<eltag effect="plain" :type="supplierTagType[row.supplier]">
{{ row.supplier }}
</eltag>
</template>
</eltablecolumn>

<! 入库日期列 >
<eltablecolumn prop="storageDate" label="入库日期" width="150">
<template #default="{ row }">
{{ formatDate(row.storageDate) }}
</template>
</eltablecolumn>

<! 地区列(带筛选) >
<eltablecolumn
prop="region"
label="地区"
width="100"
:filters="filters.region"
:filtermethod="filterData"
>
<template #default="{ row }">
<eltag effect="plain">{{ row.region }}</eltag>
</template>
</eltablecolumn>

<! 备注列 >
<eltablecolumn prop="remark" label="备注" minwidth="200"></eltablecolumn>

<! 操作列 >
<eltablecolumn label="操作" width="180" fixed="right">
<template #default="{ row }">
<elbutton type="primary" size="small" @click="handleEdit(row)">
<elicon><Edit /></elicon>修改
</elbutton>
<elbutton type="danger" size="small" @click="handleDelete(row)">
<elicon><Delete /></elicon>删除
</elbutton>
</template>
</eltablecolumn>
</eltable>
</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>
.datatable {
margintop: 20px;
}
</style>

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

<BillTable
:tabledata="tableData"
:filters="filters"
:suppliertagtype="supplierTagType"
@edit="handleEdit"
@delete="handleDelete"
/>

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

赞(0)
未经允许不得转载:网硕互联帮助中心 » Vue3 封装el-table组件
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!