Table 表格组件
对 element-plus
的 Table
组件进行封装,只需传入 columns
与 data
参数,即可渲染出响应的表格出来。
Table 组件位于 src/components/Table 内
注意
推荐使用 tsx 来使用 Table
组件。
用法
基础用法
<script setup lang="ts">
import { reactive } from 'vue'
import { Table, TableColumn } from '@/components/Table'
const columns = reactive<TableColumn[]>([
{
field: 'title',
label: 'title'
},
{
field: 'author',
label: 'author'
}
])
const data = reactive([
{
title: 'title1',
author: 'author1'
},
{
title: 'title2',
author: 'author2'
},
{
title: 'title3',
author: 'author3'
}
])
</script>
<template>
<Table :columns="columns" :data="data" />
</template>
useTable
推荐配合 useTable
来使用
复杂点的例子,请在线预览
<script setup lang="tsx">
import { ContentWrap } from '@/components/ContentWrap'
import { useI18n } from '@/hooks/web/useI18n'
import { Table, TableColumn, TableSlotDefault } from '@/components/Table'
import { getTreeTableListApi } from '@/api/table'
import { reactive, unref } from 'vue'
import { ElTag, ElButton } from 'element-plus'
import { useTable } from '@/hooks/web/useTable'
const { tableRegister, tableState } = useTable({
fetchDataApi: async () => {
const { currentPage, pageSize } = tableState
const res = await getTreeTableListApi({
pageIndex: unref(currentPage),
pageSize: unref(pageSize)
})
return {
list: res.data.list,
total: res.data.total
}
}
})
const { loading, dataList, total, currentPage, pageSize } = tableState
const { t } = useI18n()
const columns = reactive<TableColumn[]>([
{
field: 'selection',
type: 'selection'
},
{
field: 'index',
label: t('tableDemo.index'),
type: 'index'
},
{
field: 'content',
label: t('tableDemo.header'),
children: [
{
field: 'title',
label: t('tableDemo.title')
},
{
field: 'author',
label: t('tableDemo.author')
},
{
field: 'display_time',
label: t('tableDemo.displayTime')
},
{
field: 'importance',
label: t('tableDemo.importance'),
formatter: (_: Recordable, __: TableColumn, cellValue: number) => {
return (
<ElTag type={cellValue === 1 ? 'success' : cellValue === 2 ? 'warning' : 'danger'}>
{cellValue === 1
? t('tableDemo.important')
: cellValue === 2
? t('tableDemo.good')
: t('tableDemo.commonly')}
</ElTag>
)
}
},
{
field: 'pageviews',
label: t('tableDemo.pageviews')
}
]
},
{
field: 'action',
label: t('tableDemo.action'),
slots: {
default: (data) => {
return (
<ElButton type="primary" onClick={() => actionFn(data)}>
{t('tableDemo.action')}
</ElButton>
)
}
}
}
])
const actionFn = (data: TableSlotDefault) => {
console.log(data)
}
</script>
<template>
<ContentWrap :title="`${t('router.treeTable')} ${t('tableDemo.example')}`">
<Table
v-model:pageSize="pageSize"
v-model:currentPage="currentPage"
:columns="columns"
:data="dataList"
row-key="id"
:loading="loading"
sortable
:pagination="{
total: total
}"
@register="tableRegister"
/>
</ContentWrap>
</template>
</script>
<template>
<Table
v-model:pageSize="tableObject.pageSize"
v-model:currentPage="tableObject.currentPage"
:data="tableObject.tableList"
:loading="tableObject.loading"
:pagination="{
total: tableObject.total
}"
@register="register"
/>
</template>
参数介绍
const { tableRegister, tableState, tableMethods } = useTable(props: UseTableConfig)
props
在使用 useTable
的时候,需要传入 fetchDataApi
,为了保证可定制,需要自行在 fetchDataApi
中完成请求逻辑,之后返回结果 { list: Array, total?: number },后续分页,就可以自动请求数据。
如果需要删除,同样需要传入 fetchDelApi
,返回一个 Boolean
来判断是否删除完成,后续 useTable
将自行刷新表格。
tableRegister
tableRegister
用于注册 useTable
,如果需要使用 useTable
提供的 api
,必须将 tableRegister
传入组件的 onRegister
tableState
表格状态
属性 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
pageSize | 每页显示多少条 | number | - | 10 |
currentPage | 当前页 | number | - | 1 |
total | 总条数 | number | - | - |
dataList | 表格数据 | any[] | - | [] |
loading | 表格是否加载中 | boolean | - | false |
tableMethods
方法名 | 说明 | 回调参数 |
---|---|---|
setProps | 用于表格组件属性 | (props: Recordable) => void |
getList | 获取表格数据 | () => Promise<void> |
setColumn | 设置表头结构 | (columnProps: TableSetProps[]) => void |
addColumn | 新增表头结构 | (tableColumn: TableColumn, index?: number) => void |
delColumn | 删除表头结构 | (field: string) => void |
getElTableExpose | 获取 ElTable 实例 | () => Promise<typeof ElTable> |
refresh | 刷新表格 | () => void |
delList | 删除数据 | (idsLength: number) => Promise<void> |
Table 属性
除以下参数外,还支持 element-plus
的 Table
所有属性,详见
属性 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
pageSize | 每页显示多少条,支持 v-model 双向绑定 | number | - | 10 |
currentPage | 当前页,支持 v-model 双向绑定 | number | - | 1 |
selection | 是否多选 | boolean | - | true |
showOverflowTooltip | 是否所有的超出隐藏,优先级低于 schema 中的 showOverflowTooltip | boolean | - | true |
columns | 表头结构,详见 | TableColumn[] | - | [] |
expand | 是否显示展开行 | boolean | - | false |
pagination | 是否展示分页,详见 | Pagination /undefined | - | - |
reserveSelection | 仅对 type=selection 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的数据(需指定 row-key) | boolean | - | false |
loading | 加载状态 | boolean | - | false |
reserveIndex | 是否叠加索引 | boolean | - | false |
align | 内容对齐方式 | string | left /center /right | left |
headerAlign | 表头对齐方式 | string | left /center /right | left |
data | 表格数据 | Recordable[] | - | [] |
showAction | 是否显示表格操作 | boolean | - | false |
imagePreview | 需要展示图片的字段 | string[] | - | - |
videoPreview | 需要展示视频的字段 | string[] | - | - |
customContent | 是否自定义内容 | boolean | - | false |
cardBodyStyle | 卡片内容样式 | CSSProperties | - | - |
cardBodyClass | 卡片内容类名 | string | - | - |
cardWrapStyle | 卡片容器样式 | CSSProperties | - | - |
cardWrapClass | 卡片容器类名 | string | - | - |
Columns
除了以下属性,还支持 element-plus
的 TableColumn
属性。
属性 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
field | 唯一值,如需展示正确的数据,需要与 data 中的属性名对应 | string | - | - |
label | 表头名称 | string | - | - |
hidden | 是否隐藏 | boolean | - | - |
slots | 插槽对象 | object | - | - |
children | 子项,用于多级表头 | TableColumn[] | - | - |
Pagination
支持 element-plus
的 Pagination
所有属性,详见
Table 方法
方法名 | 说明 | 回调参数 |
---|---|---|
setProps | 用于设置表格属性 | (props: Recordable) => void |
setColumn | 用于修改表头结构 | (columnProps: TableSetPropsType[]) => void |
addColumn | 新增表头结构 | (tableColumn: TableColumn, index?: number) => void |
delColumn | 删除表头结构 | (field: string) => void |