自定义渲染、自定义显示、自定义按钮:titleField、行头/行底插槽、标题/内容/右侧插槽

<template>
	<view class="table-demo">
		<vol-alert type="primary">
			<view>自定义渲染、自定义显示、自定义按钮</view>
		</vol-alert>
		<vol-table :readonly="true" direction="list" titleField="OrderNo" :table-data="tableData" :columns="columns"
			@extraClick="onExtraClick">
			<template #header="{ data }">
				<view class="list-header-tip">第 {{ data.rowIndex + 1 }} 行</view>
			</template>
			<!-- #title:列须 titleSlot: true -->
			<template #title="{ data }">
				<view v-if="data.field === 'Customer'" class="slot-title">
					<text>{{ data.column.title }}</text>
					<text class="slot-title-tip">#{{ data.rowIndex + 1 }}</text>
				</view>
			</template>
			<!-- #field:列须 slot: true;整行自定义 title 为空字符串 -->
			<template #field="{ data }">
				<view v-if="data.field === 'Remark'" class="slot-field" @click.stop="onRemarkClick(data)">
					(自定义渲染) {{ data.row.Remark || '--' }}(行{{ data.rowIndex + 1 }})
				</view>
				<view v-else-if="data.field === 'customRow'" class="slot-row">
					整行自定义 · 第 {{ data.rowIndex + 1 }} 行 · 订单 {{ data.row.OrderNo }}
				</view>
			</template>
			<!-- #extra:列须 extraSlot: true -->
			<template #extra="{ data }">
				<view v-if="data.field === 'PhoneNo'" class="slot-extra" @click.stop="onCallClick(data)">拨打</view>
			</template>
			<template #bottom="{ data }">
				<view class="fx buttons">
					<view class="btn">
						<vol-button size="small" type="default" :plain="true"
							@click="rowBtnClick(data.row, data.rowIndex)">查看</vol-button>
					</view>
					<view class="btn">
						<vol-button size="small" type="primary" :plain="true"
							@click="rowBtnClick(data.row, data.rowIndex)">签收</vol-button>
					</view>
				</view>
			</template>
		</vol-table>
	</view>
</template>
<!--
更多表单配置:http://app.volcore.xyz/docs/app/form/
更多表格配置:http://app.volcore.xyz/docs/app/table/
-->
<script setup>
import { ref, getCurrentInstance } from 'vue'
const { proxy } = getCurrentInstance()

const rowBtnClick = (row, index) => proxy.$toast('点击了第' + (index + 1) + '行按钮')
const onRemarkClick = (data) => proxy.$toast(`第${data.rowIndex + 1}行备注:${data.row.Remark || '空'}`)
const onCallClick = (data) => proxy.$toast(`第${data.rowIndex + 1}行拨打:${data.row.PhoneNo || ''}`)
const onExtraClick = (item, row, index) => proxy.$toast(`extra按钮:第${index + 1}行 · ${item.field}`)

const columns = ref([
	{ field: 'OrderNo', title: '订单编号', type: 'string', readonly: true },
	{ field: 'Customer', title: '客户', type: 'input', titleSlot: true },
	{ field: 'PhoneNo', title: '电话', type: 'input', extraSlot: true },
	{
		field: 'OrderType', title: '订单类型', type: 'select', bind: { key: '订单类型', data: [] },
		extra: { text: '查询', button: true, type: 'primary', icon: 'search', color: '#fff', size: 12 }
	},
	{ field: 'TotalPrice', title: '总价', type: 'decimal' },
	{ field: 'TotalQty', title: '总数量', type: 'int' },
	{ field: 'OrderDate', title: '订单日期', type: 'date' },
	{ field: 'Remark', title: '备注', type: 'string', slot: true },
	{ title: '', field: 'customRow', slot: true }
])

const tableData = ref([
	{
		OrderNo: 'P-20241114-000005', Customer: '王语嫣', PhoneNo: '18612349000',
		OrderType: 5, TotalPrice: 50089, TotalQty: 150, Remark: '加急'
	}
])
</script>
Last Updated 2026/10/23 15:32:21