在实际业务中,主从表(Master-Detail)是一种常见的数据展示形式,例如产品列表下包含多个订单明细、项目下包含子任务等。vxe-table 提供了强大的展开行(Expand Row) 功能,允许用户通过点击展开按钮,在主行下方嵌入子表格或其他自定义内容,完美实现主从数据的关联展示。
本文将介绍两种典型场景:
通过这两个案例,你将掌握 vxe-grid 展开行的核心用法,包括:
通过展开行方式实现实现产品列表带子产品明细表,子表展示显示信息
| 配置项 | 作用 |
|---|---|
| expandConfig | 全局展开行为配置,如 labelField 指定展开按钮的提示字段,padding 控制内边距 |
| columns 中某列设置 type: 'expand' | 在该列显示展开/收起按钮,同时通过 slots.content 指定展开区域的内容模板 |
| slots 自定义插槽 | 可定义 default 插槽定制该列的默认显示内容(非展开时),以及 content 插槽定义子表格 |

<template>
<div>
<vxe-grid v-bind="gridOptions">
<template #status_default="{ row }">
<vxe-tag v-if="row.status === 'complete'" status="success" content="已完成"></vxe-tag>
<vxe-tag v-else-if="row.status === 'cancel'" status="warning" content="已取消"></vxe-tag>
<vxe-tag v-else-if="row.status === 'pending'" status="error" content="待付款"></vxe-tag>
<vxe-tag v-else status="info" content="未提交"></vxe-tag>
</template> <template #expand_content="{ row }">
<vxe-grid v-bind="subGridOptions" :data="row.detailedList">
<template #order_name_default="{ row: subRow }">
<div>{{ subRow.orderName }}</div>
<div>编码:<vxe-text :content="subRow.orderNO" click-to-copy></vxe-text></div>
<div>型号:<vxe-text :content="subRow.orderCode" click-to-copy></vxe-text></div>
<div>品牌:{{ subRow.orderType }}</div>
</template> <template #amount_default="{ row: subRow }">
<div>价格:¥{{ formatAmount(subRow.amount) }}</div>
<div>数量:{{ subRow.quantity }}</div>
</template> <template #user_default="{ row: subRow }">
<div>提交人:{{ subRow.createBy }}</div>
<div>提时间:{{ subRow.createDate }}</div>
<div>修改人:{{ subRow.createBy }}</div>
<div>修改时间:{{ subRow.createDate }}</div>
</template>
</vxe-grid>
</template>
</vxe-grid>
</div>
</template><script setup>
import { reactive } from 'vue'
import XEUtils from 'xe-utils'const gridOptions = reactive({
border: true,
height: 800,
rowConfig: {
keyField: 'id',
isHover: true,
isCurrent: true
},
expandConfig: {
labelField: 'productNO',
padding: true
},
columns: [
{ type: 'seq', width: 70 },
{ field: 'productNO', title: '产品编号', type: 'expand', width: 260, slots: { content: 'expand_content' } },
{ field: 'productName', title: '产品名称' },
{ field: 'status', title: '状态', width: 100, slots: { default: 'status_default' } },
{ field: 'createBy', title: '创建人', width: 100 },
{ field: 'createDate', title: '创建时间', width: 160 }
],
data: [
{
id: 10001,
productName: '笔记本电脑',
productNO: 'X202365859658869897135854',
status: 'complete',
updateBy: '老徐',
updateDate: '2026-01-01',
createBy: '老徐',
createDate: '2026-01-01',
detailedList: [
{
orderImg: 'https://vxeui.com/resource/productImg/product3.png',
orderName: '火星折叠笔记本',
orderNO: 'X30233454565',
orderCode: 'DOJ8',
orderType: '地球第三品牌',
amount: 6900,
quantity: 24,
updateBy: '老徐',
updateDate: '2026-01-05',
createBy: '老徐',
createDate: '2026-01-05'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product2.png',
orderName: '月球超级笔记本',
orderNO: 'X30233658020',
orderCode: 'FRG4',
orderType: '',
amount: 6900,
quantity: 24,
updateBy: '老王',
updateDate: '2026-01-01',
createBy: '老王',
createDate: '2026-01-01'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product4.png',
orderName: '地球意念笔记本',
orderNO: 'X30024536568',
orderCode: 'SEFD32',
orderType: '地球第二品牌',
amount: 6900,
quantity: 24,
updateBy: '小红',
updateDate: '2026-01-03',
createBy: '小红',
createDate: '2026-01-03'
}
]
},
{
id: 10002,
productName: '手机',
productNO: 'X2023658596545685633241332',
status: 'cancel',
updateBy: '小明',
updateDate: '2026-01-03',
createBy: '小明',
createDate: '2026-01-03',
detailedList: [
{
orderImg: 'https://vxeui.com/resource/productImg/product7.png',
orderName: '火星透视手机',
orderNO: 'X30207598632',
orderCode: 'JUKI8',
orderType: '地球第二品牌',
amount: 4900,
quantity: 68,
updateBy: '小明',
updateDate: '2026-01-08',
createBy: '小明',
createDate: '2026-01-08'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product12.png',
orderName: '火星意念手机',
orderNO: 'X30201254365',
orderCode: 'DFGFDSG2',
orderType: '地球第二品牌',
amount: 4900,
quantity: 68,
updateBy: '李四',
updateDate: '2026-01-01',
createBy: '李四',
createDate: '2026-01-01'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product10.png',
orderName: '月球折叠手机',
orderNO: 'X01235435454',
orderCode: 'SDFSD5',
orderType: '地球第三品牌',
amount: 4900,
quantity: 68,
updateBy: '老徐',
updateDate: '2026-01-03',
createBy: '老徐',
createDate: '2026-01-03'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product9.png',
orderName: '地球触摸手机',
orderNO: 'X75000525352',
orderCode: 'QSDS3D',
orderType: '地球第二品牌',
amount: 4900,
quantity: 68,
updateBy: '老刘',
updateDate: '2026-01-04',
createBy: '老刘',
createDate: '2026-01-04'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product8.png',
orderName: '地球红外手机',
orderNO: 'X20003545425',
orderCode: 'BNMO90',
orderType: '地球第三品牌',
amount: 4900,
quantity: 68,
updateBy: '老徐',
updateDate: '2026-01-02',
createBy: '老徐',
createDate: '2026-01-02'
}
]
},
{
id: 10003,
productName: '显示器',
productNO: 'X2023658596500456378578568',
status: 'pending',
updateBy: '老王',
updateDate: '2026-01-05',
createBy: '老王',
createDate: '2026-01-05',
detailedList: [
{
orderImg: 'https://vxeui.com/resource/productImg/product1.png',
orderName: '火星128k超级显示器',
orderNO: 'X96786522455',
orderCode: 'DSFG34',
orderType: '地球第三品牌',
amount: 990,
quantity: 43,
updateBy: '老徐',
updateDate: '2026-01-09',
createBy: '老徐',
createDate: '2026-01-09'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product6.png',
orderName: '地球16k显示器',
orderNO: 'X3478502552',
orderCode: 'SDFG4',
orderType: '地球第二品牌',
amount: 990,
quantity: 43,
updateBy: '张三',
updateDate: '2026-01-07',
createBy: '张三',
createDate: '2026-01-07'
}
]
}
]
})
const subGridOptions = reactive({
border: true,
cellConfig: {
height: 100
},
rowConfig: {
isHover: true
},
columns: [
{
field: 'orderImg',
title: '图片',
width: 100,
cellRender: {
name: 'VxeImage',
props: {
width: 80,
height: 80
}
}
},
{ field: 'orderName', title: '商品信息', slots: { default: 'order_name_default' } },
{ field: 'amount', title: '价格', width: 160, slots: { default: 'amount_default' } },
{ field: 'createBy', title: '提交人', width: 240, slots: { default: 'user_default' } }
]
})const formatAmount = (num) => {
return XEUtils.commafy(num)
}</script>
通过展开行方式实现实现产品明细列表,主表和子表都有详细详细

<template>
<div>
<vxe-grid v-bind="gridOptions">
<template #status_default="{ row }">
<vxe-tag v-if="row.status === 'complete'" status="success" content="已完成"></vxe-tag>
<vxe-tag v-else-if="row.status === 'cancel'" status="warning" content="已取消"></vxe-tag>
<vxe-tag v-else-if="row.status === 'pending'" status="error" content="待付款"></vxe-tag>
<vxe-tag v-else status="info" content="未提交"></vxe-tag>
</template> <template #expand_default="{ row }">
<div>{{ row.productName }}</div>
<div>编码:<vxe-text :content="row.productNO" click-to-copy></vxe-text></div>
<div>品牌:{{ row.brand }}</div>
</template> <template #sku_default="{ row }">
<div>SKU:<vxe-text :content="row.sku" click-to-copy></vxe-text></div>
<div>颜色:{{ row.color }}</div>
</template> <template #quantity_default="{ row }">
<div>库存:{{ row.inventory }}</div>
<div>数量:{{ row.quantity }}</div>
</template> <template #user_default="{ row }">
<div>负责人:{{ row.createBy }}</div>
<div>提交时间:{{ row.createDate }}</div>
<div>审批人:{{ row.createBy }}</div>
<div>审批时间:{{ row.createDate }}</div>
</template> <template #expand_content="{ row }">
<vxe-grid v-bind="subGridOptions" :data="row.detailedList">
<template #order_name_default="{ row: subRow }">
<div>{{ subRow.orderName }}</div>
<div>编码:<vxe-text :content="subRow.orderNO" click-to-copy></vxe-text></div>
<div>型号:<vxe-text :content="subRow.orderCode" click-to-copy></vxe-text></div>
<div>品牌:{{ subRow.orderType }}</div>
</template> <template #amount_default="{ row: subRow }">
<div>价格:¥{{ formatAmount(subRow.amount) }}</div>
<div>数量:{{ subRow.quantity }}</div>
</template> <template #user_default="{ row: subRow }">
<div>提交人:{{ subRow.createBy }}</div>
<div>提交时间:{{ subRow.createDate }}</div>
<div>修改人:{{ subRow.createBy }}</div>
<div>修改时间:{{ subRow.createDate }}</div>
</template>
</vxe-grid>
</template>
</vxe-grid>
</div>
</template><script setup>
import { reactive } from 'vue'
import XEUtils from 'xe-utils'const gridOptions = reactive({
border: true,
height: 800,
rowConfig: {
keyField: 'id',
isHover: true,
isCurrent: true
},
expandConfig: {
padding: true
},
columns: [
{ type: 'seq', width: 70 },
{ field: 'productNO', title: '产品编号', type: 'expand', minWidth: 320, slots: { default: 'expand_default', content: 'expand_content' } },
{
field: 'productImg',
title: '图片',
width: 100,
cellRender: {
name: 'VxeImage',
props: {
width: 80,
height: 80
}
}
},
{ field: 'sku', title: 'SKU', minWidth: 180, slots: { default: 'sku_default' } },
{ field: 'quantity', title: '数量', width: 120, slots: { default: 'quantity_default' } },
{ field: 'status', title: '状态', width: 100, slots: { default: 'status_default' } },
{ field: 'createBy', title: '负责人', width: 220, slots: { default: 'user_default' } }
],
data: [
{
id: 10001,
productImg: 'https://vxeui.com/resource/productImg/product11.png',
productName: '笔记本电脑',
productNO: 'X202365859658869897135854',
brand: '地球第三品牌',
status: 'complete',
sku: '6954872145',
color: '灰色',
quantity: 46,
inventory: 299,
updateBy: '老徐',
updateDate: '2026-01-01',
createBy: '老徐',
createDate: '2026-01-01',
detailedList: [
{
orderImg: 'https://vxeui.com/resource/productImg/product3.png',
orderName: '火星折叠笔记本',
orderNO: 'X30233454565',
orderCode: 'DOJ8',
orderType: '地球第三品牌',
amount: 6900,
quantity: 24,
updateBy: '老徐',
updateDate: '2026-01-05',
createBy: '老徐',
createDate: '2026-01-05'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product2.png',
orderName: '月球超级笔记本',
orderNO: 'X30233658020',
orderCode: 'FRG4',
orderType: '',
amount: 6900,
quantity: 24,
updateBy: '老王',
updateDate: '2026-01-01',
createBy: '老王',
createDate: '2026-01-01'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product4.png',
orderName: '地球意念笔记本',
orderNO: 'X30024536568',
orderCode: 'SEFD32',
orderType: '地球第二品牌',
amount: 6900,
quantity: 24,
updateBy: '小红',
updateDate: '2026-01-03',
createBy: '小红',
createDate: '2026-01-03'
}
]
},
{
id: 10002,
productImg: 'https://vxeui.com/resource/productImg/product10.png',
productName: '手机',
productNO: 'X2023658596545685633241332',
brand: '地球第四品牌',
status: 'cancel',
sku: '234456567',
color: '黑色',
quantity: 15,
inventory: 186,
updateBy: '小明',
updateDate: '2026-01-03',
createBy: '小明',
createDate: '2026-01-03',
detailedList: [
{
orderImg: 'https://vxeui.com/resource/productImg/product7.png',
orderName: '火星透视手机',
orderNO: 'X30207598632',
orderCode: 'JUKI8',
orderType: '地球第二品牌',
amount: 4900,
quantity: 68,
updateBy: '小明',
updateDate: '2026-01-08',
createBy: '小明',
createDate: '2026-01-08'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product12.png',
orderName: '火星意念手机',
orderNO: 'X30201254365',
orderCode: 'DFGFDSG2',
orderType: '地球第二品牌',
amount: 4900,
quantity: 68,
updateBy: '李四',
updateDate: '2026-01-01',
createBy: '李四',
createDate: '2026-01-01'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product10.png',
orderName: '月球折叠手机',
orderNO: 'X01235435454',
orderCode: 'SDFSD5',
orderType: '地球第三品牌',
amount: 4900,
quantity: 68,
updateBy: '老徐',
updateDate: '2026-01-03',
createBy: '老徐',
createDate: '2026-01-03'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product9.png',
orderName: '地球触摸手机',
orderNO: 'X75000525352',
orderCode: 'QSDS3D',
orderType: '地球第二品牌',
amount: 4900,
quantity: 68,
updateBy: '老刘',
updateDate: '2026-01-04',
createBy: '老刘',
createDate: '2026-01-04'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product8.png',
orderName: '地球红外手机',
orderNO: 'X20003545425',
orderCode: 'BNMO90',
orderType: '地球第三品牌',
amount: 4900,
quantity: 68,
updateBy: '老徐',
updateDate: '2026-01-02',
createBy: '老徐',
createDate: '2026-01-02'
}
]
},
{
id: 10003,
productImg: 'https://vxeui.com/resource/productImg/product7.png',
productName: '显示器',
productNO: 'X2023658596500456378578568',
brand: '地球第二品牌',
status: 'pending',
sku: '5672345',
color: '蓝色',
quantity: 86,
inventory: 386,
updateBy: '老王',
updateDate: '2026-01-05',
createBy: '老王',
createDate: '2026-01-05',
detailedList: [
{
orderImg: 'https://vxeui.com/resource/productImg/product1.png',
orderName: '火星128k超级显示器',
orderNO: 'X96786522455',
orderCode: 'DSFG34',
orderType: '地球第三品牌',
amount: 990,
quantity: 43,
updateBy: '老徐',
updateDate: '2026-01-09',
createBy: '老徐',
createDate: '2026-01-09'
},
{
orderImg: 'https://vxeui.com/resource/productImg/product6.png',
orderName: '地球16k显示器',
orderNO: 'X3478502552',
orderCode: 'SDFG4',
orderType: '地球第二品牌',
amount: 990,
quantity: 43,
updateBy: '张三',
updateDate: '2026-01-07',
createBy: '张三',
createDate: '2026-01-07'
}
]
}
]
})const subGridOptions = reactive({
border: true,
cellConfig: {
height: 100
},
rowConfig: {
isHover: true
},
columns: [
{
field: 'orderImg',
title: '图片',
width: 100,
cellRender: {
name: 'VxeImage',
props: {
width: 80,
height: 80
}
}
},
{ field: 'orderName', title: '商品信息', minWidth: 140, slots: { default: 'order_name_default' } },
{ field: 'amount', title: '价格', width: 160, slots: { default: 'amount_default' } },
{ field: 'createBy', title: '提交人', width: 240, slots: { default: 'user_default' } }
]
})const formatAmount = (num) => {
return XEUtils.commafy(num)
}
</script>
场景一的主表展开列只显示了产品编号(未使用 default 插槽),场景二则通过 default 插槽丰富了折叠时的展示信息。
两种方式都能满足主从表的需求,你可以根据 UI 设计选择是否在展开列中显示额外信息。
利用 vxe-table 的展开行机制,我们可以优雅地实现产品列表与明细列表的关联展示。通过简单的配置:
vxetable.cn