49 lines
1.3 KiB
TypeScript
49 lines
1.3 KiB
TypeScript
import { defineComponent } from 'vue'
|
|
import { ElTableColumn } from 'element-plus'
|
|
import { Column } from './ctable'
|
|
|
|
export default defineComponent({
|
|
name: 'DynamicTable',
|
|
props: {
|
|
columns: {
|
|
type: Array<Column>,
|
|
default: []
|
|
},
|
|
api: {
|
|
type: String,
|
|
default: ''
|
|
}
|
|
},
|
|
setup(props, { slots }) {
|
|
const renderColumns = (columns: Array<Column>) => {
|
|
return columns.map(column => {
|
|
if (column.children) {
|
|
return (
|
|
<ElTableColumn label="{column.label}" key="{column.label}">
|
|
{renderColumns(column.children)}
|
|
</ElTableColumn>
|
|
)
|
|
} else {
|
|
return (
|
|
<ElTableColumn label="{column.label}" prop="{column.prop}" key="{column.prop}">
|
|
{{
|
|
default: (row: any) => {
|
|
// 使用默认插槽
|
|
return row[column.prop as string]
|
|
},
|
|
customSlot: (row: any) => {
|
|
// 使用具名插槽 customSlot
|
|
return slots.customSlot ? slots.customSlot({ column, row }) : null
|
|
}
|
|
}}
|
|
</ElTableColumn>
|
|
)
|
|
}
|
|
})
|
|
}
|
|
|
|
return renderColumns(props.columns)
|
|
// return () => <ElTable data="{props.data}">{renderColumns(props.columns)}</ElTable>
|
|
}
|
|
})
|