# Table 表格组件
对 `element-plus` 的 `Table` 组件进行封装,只需传入 `columns` 与 `data` 参数,即可渲染出响应的表格出来。
Table 组件位于 [src/components/Table](https://github.com/kailong321200875/vue-element-plus-admin/tree/master/src/components/Table) 内
## 用法
```vue
```
### refTable
如果只使用 `refTable`,所有参数都需要手动传入到 `Table` 组件中,推荐配合 `useTable` 使用。
### useTable
复杂点的例子,请[在线预览](https://element-plus-admin.cn/#/components/table/use-table)
```vue
```
#### 参数介绍
```ts
interface Response {
total: number
list: TableData[]
}
const { register, tableObject, methods, elTableRef } = useTable(props: UseTableConfig)
```
**useTable** 可以传入自定义类型 ``
- T 代表接口返回的数据类型。
- K 代表接口返回的表格数据类型。
- L 代表接口请求参数的类型。
在实际需求中,可能会遇到分页参数命名不同的情况,请自行在 [src/hooks/web/useTable.ts](https://github.com/kailong321200875/vue-element-plus-admin/tree/master/src/hooks/web/useTable.ts) 进行替换,搜索 `pageSize` 及 `pageIndex`。
**props**
在使用 `useTable` 的时候,可以在 `props` 中传入 `getListApi`,以及 `response`,之后就可以手动调用 `methods.getList()` 方法请求表格数据了。每次表格分页时,则会自动调用接口。
如果需要使用删除方法 `methods.delList()`,则需要在 `props` 中传入 `delListApi` 参数,用于删除时调用接口,目前本项目中单条删除或者批量删除,都是同样的接口同样的参数。如果与实际需求不符,可以自行改造。在 [src/hooks/web/useTable.ts](https://github.com/kailong321200875/vue-element-plus-admin/tree/master/src/hooks/web/useTable.ts) 的 `delList` 以及 `delData` 中修改。
```ts
// 删除数据
delList: async (ids: string[] | number[], multiple: boolean, message = true) => {
const tableRef = await getTable()
if (multiple) {
if (!tableRef?.selections.length) {
ElMessage.warning(t('common.delNoData'))
return
}
} else {
if (!tableObject.currentRow) {
ElMessage.warning(t('common.delNoData'))
return
}
}
const paramsObj: AxiosConfig = {
data: {
ids
}
}
if (message) {
ElMessageBox.confirm(t('common.delMessage'), t('common.delWarning'), {
confirmButtonText: t('common.delOk'),
cancelButtonText: t('common.delCancel'),
type: 'warning'
})
.then(async () => {
await delData(paramsObj, ids)
})
.catch(() => {})
} else {
await delData(paramsObj, ids)
}
}
```
```ts
const delData = async (paramsObj: AxiosConfig, ids: string[] | number[]) => {
const res = await (config?.delListApi && config?.delListApi(paramsObj))
if (res) {
ElMessage.success(t('common.delSuccess'))
// 计算出临界点
const currentPage =
tableObject.total % tableObject.pageSize === ids.length || tableObject.pageSize === 1
? tableObject.currentPage > 1
? tableObject.currentPage - 1
: tableObject.currentPage
: tableObject.currentPage
tableObject.currentPage = currentPage
methods.getList()
}
}
```
**register**
`register` 用于注册 `useTable`,如果需要使用 `useTable` 提供的 `api`,必须将 `register` 传入组件的 `onRegister`
**tableObject**
表格对象
| 属性 | 说明 | 类型 | 可选值 | 默认值 |
| ---- | ---- | ---- | ---- | ---- |
| pageSize | 每页显示多少条 | `number` | - | 10 |
| currentPage | 当前页 | `number` | - | 1 |
| total | 总条数 | `number` | - | - |
| tableList | 表格数据 | `K[]` | - | [] |
| parmasObj | AxiosConfig 配置 | `L` | - | {} |
| loading | 表格是否加载中 | `boolean` | - | false |
| currentRow | 当前选中数据 | `Nullable` | - | - |
**methods**
| 方法名 | 说明 | 回调参数 |
| ---- | ---- | ---- |
| setProps | 用于表格组件属性 | (props: Recordable) => void |
| getList | 获取表格数据 | `() => Promise` |
| setColumn | 设置表头结构 | (columnProps: TableSetPropsType[]) => void |
| setSearchParmas | 与 Search 组件配置,用于获取 Search 组件返回的查询数据 | (data: Recordable) => void |
| getSelections | 获取多选数据 | () => Promise |
| delList | 删除数据接口 | `(ids: string[], multiple: boolean, message?: boolean) => Promise` |
**elTableRef**
当前 `elTable` 实例,可使用所有 `elTable` 实例方法。
## Table 属性
除以下参数外,还支持 `element-plus` 的 `Table` 所有属性,[详见](https://element-plus.org/zh-CN/component/table.html#table-attributes)
| 属性 | 说明 | 类型 | 可选值 | 默认值 |
| ---- | ---- | ---- | ---- | ---- |
| pageSize | 每页显示多少条,支持 v-model 双向绑定 | `number` | - | 10 |
| currentPage | 当前页,支持 v-model 双向绑定 | `number` | - | 1 |
| selection | 是否多选 | `boolean` | - | true |
| showOverflowTooltip | 是否所有的超出隐藏,优先级低于 schema 中的 showOverflowTooltip | `boolean` | - | true |
| columns | 表头结构,[详见](#Columns) | `TableColumn[]` | - | [] |
| expand | 是否显示展开行 | `boolean` | - | false |
| pagination | 是否展示分页,[详见](#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[]` | - | [] |
### Columns
| 属性 | 说明 | 类型 | 可选值 | 默认值 |
| ---- | ---- | ---- | ---- | ---- |
| field | 唯一值,如需展示正确的数据,需要与 data 中的属性名对应 | `string` | - | - |
| label | 表头名称 | `string` | - | - |
| children | 子项,用于多级表头 | `TableColumn[]` | - | - |
### Pagination
支持 `element-plus` 的 `Pagination` 所有属性,[详见](https://element-plus.org/zh-CN/component/pagination.html#%E5%B1%9E%E6%80%A7)
## Table 方法
| 方法名 | 说明 | 回调参数 |
| ---- | ---- | ---- |
| setProps | 用于设置表格属性 | (props: Recordable) => void |
| setColumn | 用于修改表头结构 | (columnProps: TableSetPropsType[]) => void |
## Table 插槽
| 插槽名 | 说明 | 子标签 |
| ---- | ---- | ---- |
| append | 插入至表格最后一行之后的内容, 如果需要对表格的内容进行无限滚动操作,可能需要用到这个 slot。 若表格有合计行,该 slot 会位于合计行之上。| - |
| ${field} | 表格内容 | - |
| ${field}-header | 表头内容 | - |