1
1
<script lang="ts" setup>
2
- import { ref , computed } from ' vue'
2
+ import { ref , computed , isVNode , h } from ' vue'
3
3
4
4
import vMenu from ' @/directives/menu'
5
5
import useI18n from ' @/lang'
@@ -14,7 +14,7 @@ export type Column = {
14
14
hidden? : boolean
15
15
minWidth? : string
16
16
sort? : (a : Record <string , any >, b : Record <string , any >) => number
17
- customRender? : (v : { value: any ; record: Record <string , any > }) => string
17
+ customRender? : (v : { value: any ; record: Record <string , any > }) => any
18
18
}
19
19
20
20
interface Props {
@@ -60,6 +60,15 @@ const tableData = computed(() => {
60
60
const tableColumns = computed (() => {
61
61
return props .columns .filter ((column ) => ! column .hidden )
62
62
})
63
+
64
+ const renderCell = (column : Column , record : Recordable ) => {
65
+ const value = getValue (record , column .key )
66
+ let result = column .customRender ?.({ value , record }) ?? value ?? ' -'
67
+ if (! isVNode (result )) {
68
+ result = h (' div' , result )
69
+ }
70
+ return result
71
+ }
63
72
</script >
64
73
65
74
<template >
@@ -88,21 +97,20 @@ const tableColumns = computed(() => {
88
97
</thead >
89
98
<tbody >
90
99
<tr
91
- v-for =" data in tableData"
92
- v-menu =" menu.map((v) => ({ ...v, handler: () => v.handler?.(data ) }))"
93
- :key =" data .id"
100
+ v-for =" record in tableData"
101
+ v-menu =" menu.map((v) => ({ ...v, handler: () => v.handler?.(record ) }))"
102
+ :key =" record .id"
94
103
>
95
104
<td
96
105
v-for =" column in tableColumns"
97
106
:key =" column.key"
98
107
:style =" { textAlign: column.align || 'left' }"
99
108
class =" select-text"
100
- v-html ="
101
- (column.customRender
102
- ? column.customRender({ value: getValue(data, column.key), record: data })
103
- : getValue(data, column.key)) ?? '-'
104
- "
105
- ></td >
109
+ >
110
+ <slot :name =" column.key" : =" { column, record }" >
111
+ <component :is =" renderCell(column, record)" />
112
+ </slot >
113
+ </td >
106
114
</tr >
107
115
</tbody >
108
116
</table >
0 commit comments