import{o as n,c as a,a as s}from"./app.51e46c58.js";const t='{"title":"Table 表格组件","description":"","frontmatter":{},"headers":[{"level":2,"title":"用法","slug":"用法"},{"level":3,"title":"基础用法","slug":"基础用法"},{"level":3,"title":"useTable","slug":"usetable"},{"level":2,"title":"Table 属性","slug":"table-属性"},{"level":3,"title":"Columns","slug":"columns"},{"level":3,"title":"Pagination","slug":"pagination"},{"level":2,"title":"Table 方法","slug":"table-方法"}],"relativePath":"components/table.md","lastUpdated":1721205967753}',p={},o=s('
对 element-plus
的 Table
组件进行封装,只需传入 columns
与 data
参数,即可渲染出响应的表格出来。
Table 组件位于 src/components/Table 内
注意
推荐使用 tsx 来使用 Table
组件。
<script setup lang="ts">\nimport { reactive } from 'vue'\nimport { Table, TableColumn } from '@/components/Table'\n\nconst columns = reactive<TableColumn[]>([\n {\n field: 'title',\n label: 'title'\n },\n {\n field: 'author',\n label: 'author'\n }\n])\n\nconst data = reactive([\n {\n title: 'title1',\n author: 'author1'\n },\n {\n title: 'title2',\n author: 'author2'\n },\n {\n title: 'title3',\n author: 'author3'\n }\n])\n</script>\n\n<template>\n <Table :columns="columns" :data="data" />\n</template>\n\n
推荐配合 useTable
来使用
复杂点的例子,请在线预览
<script setup lang="tsx">\nimport { ContentWrap } from '@/components/ContentWrap'\nimport { useI18n } from '@/hooks/web/useI18n'\nimport { Table, TableColumn, TableSlotDefault } from '@/components/Table'\nimport { getTreeTableListApi } from '@/api/table'\nimport { reactive, unref } from 'vue'\nimport { ElTag, ElButton } from 'element-plus'\nimport { useTable } from '@/hooks/web/useTable'\n\nconst { tableRegister, tableState } = useTable({\n fetchDataApi: async () => {\n const { currentPage, pageSize } = tableState\n const res = await getTreeTableListApi({\n pageIndex: unref(currentPage),\n pageSize: unref(pageSize)\n })\n return {\n list: res.data.list,\n total: res.data.total\n }\n }\n})\nconst { loading, dataList, total, currentPage, pageSize } = tableState\n\nconst { t } = useI18n()\n\nconst columns = reactive<TableColumn[]>([\n {\n field: 'selection',\n type: 'selection'\n },\n {\n field: 'index',\n label: t('tableDemo.index'),\n type: 'index'\n },\n {\n field: 'content',\n label: t('tableDemo.header'),\n children: [\n {\n field: 'title',\n label: t('tableDemo.title')\n },\n {\n field: 'author',\n label: t('tableDemo.author')\n },\n {\n field: 'display_time',\n label: t('tableDemo.displayTime')\n },\n {\n field: 'importance',\n label: t('tableDemo.importance'),\n formatter: (_: Recordable, __: TableColumn, cellValue: number) => {\n return (\n <ElTag type={cellValue === 1 ? 'success' : cellValue === 2 ? 'warning' : 'danger'}>\n {cellValue === 1\n ? t('tableDemo.important')\n : cellValue === 2\n ? t('tableDemo.good')\n : t('tableDemo.commonly')}\n </ElTag>\n )\n }\n },\n {\n field: 'pageviews',\n label: t('tableDemo.pageviews')\n }\n ]\n },\n {\n field: 'action',\n label: t('tableDemo.action'),\n slots: {\n default: (data) => {\n return (\n <ElButton type="primary" onClick={() => actionFn(data)}>\n {t('tableDemo.action')}\n </ElButton>\n )\n }\n }\n }\n])\n\nconst actionFn = (data: TableSlotDefault) => {\n console.log(data)\n}\n</script>\n\n<template>\n <ContentWrap :title="`${t('router.treeTable')} ${t('tableDemo.example')}`">\n <Table\n v-model:pageSize="pageSize"\n v-model:currentPage="currentPage"\n :columns="columns"\n :data="dataList"\n row-key="id"\n :loading="loading"\n sortable\n :pagination="{\n total: total\n }"\n @register="tableRegister"\n />\n </ContentWrap>\n</template>\n\n</script>\n\n<template>\n <Table\n v-model:pageSize="tableObject.pageSize"\n v-model:currentPage="tableObject.currentPage"\n :data="tableObject.tableList"\n :loading="tableObject.loading"\n :pagination="{\n total: tableObject.total\n }"\n @register="register"\n />\n</template>\n\n
const { tableRegister, tableState, tableMethods } = useTable(props: UseTableConfig)\n
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> |
除以下参数外,还支持 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 | - | - |
除了以下属性,还支持 element-plus
的 TableColumn
属性。
属性 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
field | 唯一值,如需展示正确的数据,需要与 data 中的属性名对应 | string | - | - |
label | 表头名称 | string | - | - |
hidden | 是否隐藏 | boolean | - | - |
slots | 插槽对象 | object | - | - |
children | 子项,用于多级表头 | TableColumn[] | - | - |
支持 element-plus
的 Pagination
所有属性,详见
方法名 | 说明 | 回调参数 |
---|---|---|
setProps | 用于设置表格属性 | (props: Recordable) => void |
setColumn | 用于修改表头结构 | (columnProps: TableSetPropsType[]) => void |
addColumn | 新增表头结构 | (tableColumn: TableColumn, index?: number) => void |
delColumn | 删除表头结构 | (field: string) => void |