Vue3 Element Plus table使用多级表头,数据格式的处理(包括表格展示以及编辑等操作) - 附完整示例
·
Element Plus
基于 Vue 3,面向设计师和开发者的组件库
效果

目录
一、介绍
1、官方文档
2、官方示例
二、准备工作
1、安装依赖包
# NPM
$ npm install element-plus --save
# Yarn
$ yarn add element-plus
# pnpm
$ pnpm install element-plus
2、示例版本
"element-plus": "^2.4.4",
三、使用步骤
1、element-plus自动导入
首先你需要安装unplugin-vue-components 和 unplugin-auto-import这两款插件
npm install -D unplugin-vue-components unplugin-auto-import
然后把下列代码插入到你的 Vite 或 Webpack 的配置文件中
Vite
// vite.config.ts
import { defineConfig } from 'vite'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
export default defineConfig({
// ...
plugins: [
// ...
AutoImport({
resolvers: [ElementPlusResolver()],
}),
Components({
resolvers: [ElementPlusResolver()],
}),
],
})
注:完整引入 / 按需导入 / 手动导入等方式请参照下方链接配置
2、处理数据格式
接口数据格式
const tableData = [
{
id: '1',
equipName: 'name-1',
model: '型号1',
manufacturer: 'XX公司',
manufactureDate: '2025-12-05',
parameters: [
{
key: 'power',
name: '功率',
value: '2',
unit: 'kW'
},
{
key: 'weight',
name: '重量',
value: '20',
unit: 'kg'
},
{
key: 'voltage',
name: '电压',
value: '220',
unit: 'V'
}
]
},
{
id: '2',
equipName: 'name-2',
model: '型号2',
manufacturer: 'XX公司',
manufactureDate: '2025-12-05',
parameters: [
{
key: 'power',
name: '功率',
value: '2',
unit: 'kW'
},
{
key: 'weight',
name: '重量',
value: '20',
unit: 'kg'
},
{
key: 'voltage',
name: '电压',
value: '220',
unit: 'V'
}
]
},
{
id: '3',
equipName: 'name-3',
model: '型号3',
manufacturer: 'XX公司',
manufactureDate: '2025-12-05',
parameters: [
{
key: 'power',
name: '功率',
value: '2',
unit: 'kW'
},
{
key: 'weight',
name: '重量',
value: '20',
unit: 'kg'
},
{
key: 'voltage',
name: '电压',
value: '220',
unit: 'V'
}
]
}
]
1)表格展示时的格式处理
// 获取参数值的方法
const getParameterValue = (parameters: any[], key: string) => {
if (!parameters || !Array.isArray(parameters)) return '-'
const param = parameters.find(item => item.key === key)
return param ? `${param.value} ${param.unit || ''}` : '-'
}
详见完整示例...
2)编辑回显时的格式处理
Object.assign(form, {
id: item.id || '',
equipName: item.equipName || '',
manufacturer: item.manufacturer || '',
manufactureDate: item.manufactureDate || '',
model: item.model || ''
})
form.power = item.parameters?.find((p: any) => p.key === 'power')?.value || ''
form.weight = item.parameters?.find((p: any) => p.key === 'weight')?.value || ''
form.voltage = item.parameters?.find((p: any) => p.key === 'voltage')?.value || ''
详见完整示例...
3)编辑提交时的格式处理
const submitData = {
id: form.id,
equipName: form.equipName,
manufacturer: form.manufacturer,
manufactureDate: form.manufactureDate,
model: form.model,
parameters: [
{ name: '功率', value: form.power, key: 'power', unit: 'kW' },
{ name: '重量', value: form.weight, key: 'weight', unit: 'kg' },
{ name: '电压', value: form.voltage, key: 'voltage', unit: 'V' }
].filter(item => item.value !== undefined && item.value !== null && item.value !== '')
}
详见完整示例...
四、完整示例
Index.vue
<template>
<div>
<!-- 多级表头 -->
<el-table
:data="tableData"
border
:cellStyle="{ textAlign: 'center' }"
:headerCellStyle="{
textAlign: 'center',
background: '#F5F7FA',
color: '#909399'
}"
>
<el-table-column label="多级表头">
<el-table-column type="index" label="#" width="55" />
<el-table-column prop="equipName" label="设备名称" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.equipName || '-' }}
</template>
</el-table-column>
<el-table-column prop="manufacturer" label="生产商" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.manufacturer || '-' }}
</template>
</el-table-column>
<el-table-column prop="manufactureDate" label="出厂日期" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.manufactureDate || '-' }}
</template>
</el-table-column>
<el-table-column prop="model" label="设备型号" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.model || '-' }}
</template>
</el-table-column>
<el-table-column label="设备参数">
<el-table-column prop="power" label="功率" show-overflow-tooltip>
<template #default="scope">
{{ getParameterValue(scope.row.parameters, 'power') }}
</template>
</el-table-column>
<el-table-column prop="weight" label="重量" show-overflow-tooltip>
<template #default="scope">
{{ getParameterValue(scope.row.parameters, 'weight') }}
</template>
</el-table-column>
<el-table-column prop="voltage" label="电压" show-overflow-tooltip>
<template #default="scope">
{{ getParameterValue(scope.row.parameters, 'voltage') }}
</template>
</el-table-column>
</el-table-column>
</el-table-column>
<el-table-column label="操作" width="200" fixed="right">
<template #default="scope">
<el-button
icon="edit-pen"
text
type="primary"
@click="formDialogRef?.openDialog(scope.row, 'view')"
>
详情
</el-button>
<el-button
icon="edit-pen"
text
type="warning"
@click="formDialogRef?.openDialog(scope.row)"
>
编辑
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 编辑、查看弹窗 -->
<form-dialog ref="formDialogRef" />
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const FormDialog = defineAsyncComponent(() => import('./Form.vue'))
const formDialogRef = ref()
const tableData = [
{
id: '1',
equipName: 'name-1',
model: '型号1',
manufacturer: 'XX公司',
manufactureDate: '2025-12-05',
parameters: [
{
key: 'power',
name: '功率',
value: '2',
unit: 'kW'
},
{
key: 'weight',
name: '重量',
value: '20',
unit: 'kg'
},
{
key: 'voltage',
name: '电压',
value: '220',
unit: 'V'
}
]
},
{
id: '2',
equipName: 'name-2',
model: '型号2',
manufacturer: 'XX公司',
manufactureDate: '2025-12-05',
parameters: [
{
key: 'power',
name: '功率',
value: '2',
unit: 'kW'
},
{
key: 'weight',
name: '重量',
value: '20',
unit: 'kg'
},
{
key: 'voltage',
name: '电压',
value: '220',
unit: 'V'
}
]
},
{
id: '3',
equipName: 'name-3',
model: '型号3',
manufacturer: 'XX公司',
manufactureDate: '2025-12-05',
parameters: [
{
key: 'power',
name: '功率',
value: '2',
unit: 'kW'
},
{
key: 'weight',
name: '重量',
value: '20',
unit: 'kg'
},
{
key: 'voltage',
name: '电压',
value: '220',
unit: 'V'
}
]
}
]
// 获取参数值的方法
const getParameterValue = (parameters: any[], key: string) => {
if (!parameters || !Array.isArray(parameters)) return '-'
const param = parameters.find(item => item.key === key)
return param ? `${param.value} ${param.unit || ''}` : '-'
}
</script>
Form.vue
<template>
<el-dialog
:title="isViewMode ? form.equipName + ' 详情' : form.equipName + ' 编辑'"
v-model="visible"
:close-on-click-modal="false"
draggable
width="800px"
>
<el-form
ref="dataFormRef"
:model="form"
:rules="dataRules"
label-width="90px"
v-loading="loading"
>
<el-row :gutter="24">
<el-col :span="12" class="mb20">
<el-form-item label="生产商" prop="manufacturer">
<el-input
v-model="form.manufacturer"
placeholder="请输入生产商"
:disabled="isViewMode"
/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="出厂日期" prop="manufactureDate">
<el-date-picker
v-model="form.manufactureDate"
type="date"
placeholder="请选择出厂日期"
:disabled="isViewMode"
value-format="YYYY-MM-DD"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="设备型号" prop="model">
<el-input v-model="form.model" placeholder="请输入设备型号" :disabled="isViewMode" />
</el-form-item>
</el-col>
<!-- 设备参数 -->
<el-col :span="24" class="mb10">
<h4 style="margin: 0 0 10px; font-size: 14px; font-weight: 500">设备参数</h4>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="功率" prop="power">
<el-input v-model="form.power" placeholder="请输入功率" :disabled="isViewMode" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="重量" prop="weight">
<el-input v-model="form.weight" placeholder="请输入重量" :disabled="isViewMode" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="电压" prop="voltage">
<el-input v-model="form.voltage" placeholder="请输入电压" :disabled="isViewMode" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<span class="dialog-footer">
<div v-if="isViewMode">
<el-button type="primary" @click="visible = false">关 闭</el-button>
</div>
<div v-else>
<el-button @click="visible = false">取 消</el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading">确 认</el-button>
</div>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts" name="EquipmentDialog">
import { nextTick, ref, reactive, defineEmits, defineExpose } from 'vue'
import { ElMessage } from 'element-plus'
const emit = defineEmits(['refresh'])
const dataFormRef = ref()
const visible = ref(false)
const loading = ref(false)
const isViewMode = ref(false)
const form = reactive({
id: '',
equipName: '',
manufacturer: '',
manufactureDate: '',
model: '',
power: '',
weight: '',
voltage: ''
})
const dataRules = ref({
manufacturer: [{ message: '请输入生产商', trigger: 'blur' }],
manufactureDate: [{ message: '请选择出厂日期', trigger: 'blur' }],
model: [{ message: '请输入设备型号', trigger: 'blur' }],
power: [{ message: '请输入功率', trigger: 'blur' }],
weight: [{ message: '请输入重量', trigger: 'blur' }],
voltage: [{ message: '请输入电压', trigger: 'blur' }]
})
const openDialog = (item: object, mode: 'edit' | 'view' = 'edit') => {
visible.value = true
isViewMode.value = mode === 'view'
form.id = ''
nextTick(() => {
dataFormRef.value?.resetFields()
Object.assign(form, {
id: item.id || '',
equipName: item.equipName || '',
manufacturer: item.manufacturer || '',
manufactureDate: item.manufactureDate || '',
model: item.model || ''
})
form.power = item.parameters?.find((p: any) => p.key === 'power')?.value || ''
form.weight = item.parameters?.find((p: any) => p.key === 'weight')?.value || ''
form.voltage = item.parameters?.find((p: any) => p.key === 'voltage')?.value || ''
})
}
const onSubmit = async () => {
loading.value = true
const valid = await dataFormRef.value.validate().catch(() => {})
if (!valid) {
loading.value = false
return
}
const submitData = {
id: form.id,
equipName: form.equipName,
manufacturer: form.manufacturer,
manufactureDate: form.manufactureDate,
model: form.model,
parameters: [
{ name: '功率', value: form.power, key: 'power', unit: 'kW' },
{ name: '重量', value: form.weight, key: 'weight', unit: 'kg' },
{ name: '电压', value: form.voltage, key: 'voltage', unit: 'V' }
].filter(item => item.value !== undefined && item.value !== null && item.value !== '')
}
try {
await 接口地址(submitData)
ElMessage.success('修改成功')
visible.value = false
} catch (err: any) {
ElMessage.error(err.msg || '操作失败')
} finally {
loading.value = false
}
}
defineExpose({
openDialog
})
</script>
欢迎关注VX公众号:前端小知识营地
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)