File tree Expand file tree Collapse file tree 6 files changed +73
-50
lines changed
views/components/table-page Expand file tree Collapse file tree 6 files changed +73
-50
lines changed Original file line number Diff line number Diff line change 133
133
"vite-plugin-svg-icons" : " ^2.0.1" ,
134
134
"vitest" : " ^2.1.8" ,
135
135
"vue-eslint-parser" : " ^9.4.3" ,
136
- "vue-tsc" : " ^2.1.10 " ,
136
+ "vue-tsc" : " ^2.2.0 " ,
137
137
"xlsx" : " ^0.18.5"
138
138
},
139
139
"pnpm" : {
Original file line number Diff line number Diff line change 2
2
import { ElTable } from ' element-plus' ;
3
3
import type { TableProps } from ' element-plus' ;
4
4
import TableChild from ' ./src/components/TableChild' ;
5
- import type { TableColumnProps } from ' ./types/table' ;
5
+ import type { TableColumnProps , TableSlotType } from ' ./types/table' ;
6
6
7
7
const props = defineProps <TableProps <T > & { option: TableColumnProps <T >[] }>();
8
+
9
+ defineSlots <TableSlotType <T >>();
8
10
</script >
9
11
10
12
<template >
11
13
<div >
12
14
<ElTable v-bind =" { ...props, ...$attrs }" :data =" data" :border =" border" fit show-header >
13
15
<TableChild v-for =" (item, index) in option" :key =" index" :item =" item" >
14
- <template v-for =" soitem in Object .keys ($slots )" #[soitem ]=" data " >
15
- <slot :name =" soitem " v-bind =" data" />
16
+ <template v-for =" slotsItem in Object .keys ($slots )" #[slotsItem ]=" data " >
17
+ <slot :name =" slotsItem " v-bind =" data" />
16
18
</template >
17
19
</TableChild >
18
20
</ElTable >
Original file line number Diff line number Diff line change 1
1
import { getSlot } from '@/utils/slotsHelper' ;
2
2
import { ElTableColumn } from 'element-plus' ;
3
3
import { defineComponent } from 'vue' ;
4
- import type { TableColumnCtx } from 'element-plus' ;
4
+ import type { TableColumnInstance } from 'element-plus' ;
5
5
import type { SetupContext , VNode } from 'vue' ;
6
6
import type { TableColumnProps } from '../../types/table' ;
7
7
@@ -10,17 +10,18 @@ interface RenderType {
10
10
header ?: ( scope : Recordable ) => VNode [ ] | VNode | null ;
11
11
}
12
12
13
+ // TODO: header 存在children时,slots 无法渲染
13
14
const TableChild = defineComponent (
14
15
< T extends object = any > ( props : { item : TableColumnProps < T > } , { slots } : SetupContext ) => {
15
16
const { item } = props ;
16
17
17
18
function eLComponent ( childrenRender : RenderType | null | undefined = null ) {
18
19
const { children, ...reItem } = item ;
19
20
if ( childrenRender ?. default ) {
20
- return < ElTableColumn { ...( reItem as TableColumnCtx < Recordable > ) } > { childrenRender } </ ElTableColumn > ;
21
+ return < ElTableColumn { ...( reItem as TableColumnInstance ) } > { childrenRender } </ ElTableColumn > ;
21
22
} else {
22
23
return (
23
- < ElTableColumn { ...( reItem as TableColumnCtx < Recordable > ) } >
24
+ < ElTableColumn { ...( reItem as TableColumnInstance ) } >
24
25
{ childrenRender ?. header }
25
26
{ children ?. map ( child => < TableChild item = { child } /> ) }
26
27
</ ElTableColumn >
Original file line number Diff line number Diff line change 1
- import type { TableColumnCtx } from 'element-plus' ;
1
+ import type { RenderRowData , TableColumnCtx } from 'element-plus' ;
2
2
3
3
export interface TableColumnProps < T extends Recordable = Recordable >
4
4
extends Partial < Omit < TableColumnCtx < T > , 'prop' | 'children' > > {
@@ -8,3 +8,17 @@ export interface TableColumnProps<T extends Recordable = Recordable>
8
8
render_header ?: ( row : any ) => JSX . Element ;
9
9
children ?: TableColumnProps < T > [ ] ;
10
10
}
11
+
12
+ // export type TableSlotType<T extends object = object> = {
13
+ // [key in keyof T as `${string & key}_header`]: (props: any) => void;
14
+ // };
15
+
16
+ export type TableSlotType < T extends object = object > = {
17
+ [ key in keyof T ] : ( props : RenderRowData < T > ) => void ;
18
+ } & {
19
+ [ key in keyof T as `${string & key } _header`] : (
20
+ props : Omit < RenderRowData < T > , 'row' | 'treeNode' | 'expanded' > & {
21
+ customItem : TableColumnProps < T > ;
22
+ } ,
23
+ ) => void ;
24
+ } ;
Original file line number Diff line number Diff line change 127
127
<span >表格</span >
128
128
</div >
129
129
</template >
130
+
130
131
<Table :data =" tabList" border row-key =" date" :option =" option" >
131
132
<template #name_header =" slotData " >
132
133
<span >{{ `插槽:${slotData.customItem.label}` }}</span >
You can’t perform that action at this time.
0 commit comments