mirror of https://github.com/allinssl/allinssl
5.8 KiB
5.8 KiB
useTable 使用文档
基本介绍
useTable
是一个基于 Naive UI 的表格构建工具,它提供了一种简洁的方式来创建和管理数据表格。通过这个钩子函数,你可以轻松地构建表格、管理表格状态、处理数据加载和分页等操作。
核心函数
useTable
function useTable<T = Record<string, unknown>, Z extends Record<string, unknown> = Record<string, unknown>>(
options: UseTableOptions<T, Z>,
): TableInstanceWithComponent<T, Z>
参数:
options
: 表格配置选项config
: 表格列配置request
: 数据请求函数,用于获取表格数据defaultValue
: 可选,默认请求参数,支持响应式
返回值:
loading
: 加载状态example
: 表格组件实例引用data
: 响应式表格数据param
: 请求参数reset
: 重置方法fetch
: 数据获取方法component
: 表格渲染组件config
: 表格列配置props
: 表格属性
示例:
const table = useTable({
config: [
{ title: '姓名', key: 'name' },
{ title: '年龄', key: 'age' },
],
request: async (params) => {
// 处理数据请求
const response = await api.getUsers(params)
return { data: response.data }
},
defaultValue: { page: 1, pageSize: 20 },
})
useTablePage
function useTablePage<T extends Record<string, any> = Record<string, any>>(
options: TablePageProps<T>,
): {
component: (
compProps?: Record<string, unknown>,
context?: { slots?: Record<string, () => JSX.Element> },
) => JSX.Element
handlePageChange: (currentPage: number) => void
handlePageSizeChange: (size: number) => void
pageSizeOptions: Ref<number[]>
}
参数:
options
: 分页配置选项param
: 请求参数的响应式引用alias
: 可选,字段别名映射,默认为{ page: 'page', pageSize: 'pageSize', total: 'total' }
props
: 可选,分页组件属性slot
: 可选,分页组件插槽
返回值:
component
: 分页渲染组件handlePageChange
: 页码变更处理函数handlePageSizeChange
: 每页条数变更处理函数pageSizeOptions
: 每页条数选项
示例:
const pagination = useTablePage({
param: table.param,
alias: { page: 'currentPage', pageSize: 'size', total: 'totalCount' },
props: { showQuickJumper: true },
})
使用示例
基本用法
import useTable, { useTablePage } from 'path/to/useTable'
// 创建表格实例
const table = useTable({
config: [
{ title: '姓名', key: 'name' },
{ title: '年龄', key: 'age' },
{ title: '地址', key: 'address' },
],
request: async (params) => {
// 模拟API请求
const response = await api.getUsers(params)
return { data: response.list }
},
defaultValue: { page: 1, pageSize: 20 },
})
// 创建分页实例
const pagination = useTablePage({
param: table.param,
})
// 在组件中使用
// <table.component />
// <pagination.component />
// 刷新表格数据
// await table.fetch()
// 重置表格
// await table.reset()
自定义分页
const pagination = useTablePage({
param: table.param,
alias: {
page: 'currentPage', // 自定义页码字段名
pageSize: 'size', // 自定义每页条数字段名
total: 'totalCount', // 自定义总条数字段名
},
props: {
showQuickJumper: true, // 显示快速跳转
showSizePicker: true, // 显示每页条数选择器
pageSizes: [10, 20, 50, 100], // 自定义每页条数选项
},
})
带插槽的表格
// 在组件中使用
<table.component>
{{
empty: () => <div>暂无数据</div>,
loading: () => <div>加载中...</div>
}}
</table.component>
带插槽的分页
// 在组件中使用
<pagination.component>
{{
prefix: () => <span>共 {table.param.value.total} 条</span>,
suffix: () => <button onClick={table.fetch}>刷新</button>
}}
</pagination.component>
自定义表格属性
// 设置表格属性
table.props.value = {
striped: true, // 斑马纹
bordered: false, // 无边框
singleLine: false, // 允许内容换行
size: 'small', // 表格尺寸
rowKey: (row) => row.id, // 行唯一标识
maxHeight: 400, // 最大高度
}
高级用法
条件查询
// 创建表格实例
const table = useTable({
config: [...],
request: async (params) => {
const response = await api.getUsers(params)
return { data: response.list }
},
defaultValue: {
page: 1,
pageSize: 20,
name: '',
status: null
}
})
// 条件查询
const handleSearch = () => {
table.param.value.name = searchForm.value.name
table.param.value.status = searchForm.value.status
// 查询时重置到第一页
table.param.value.page = 1
table.fetch()
}
// 重置查询
const handleReset = () => {
table.reset()
}
表格操作列
const table = useTable({
config: [
{ title: '姓名', key: 'name' },
{ title: '年龄', key: 'age' },
{
title: '操作',
key: 'actions',
render: (row) => {
return (
<div>
<button onClick={() => handleEdit(row)}>编辑</button>
<button onClick={() => handleDelete(row)}>删除</button>
</div>
)
}
}
],
request: async (params) => {
const response = await api.getUsers(params)
return { data: response.list }
}
})
注意事项
request
函数必须返回一个包含data
字段的对象,该字段包含表格数据数组。- 默认情况下,分页参数使用
page
、pageSize
和total
字段名,可以通过alias
参数自定义。 - 表格的属性可以通过
table.props.value = { ... }
进行设置。 - 当请求参数
param
发生变化时,表格会自动重新加载数据。 - 使用
reset
方法可以将请求参数重置为默认值并重新加载数据。