<template>
<div class="com-table-wrapper">
<q-table
ref="tableRef"
v-bind="$attrs"
:rows="dataList"
:loading="loading"
@request="onRequest"
>
<template v-for="(_, name) in $slots" #[name]="scope">
<slot :name="name" v-bind="scope || {}" />
</template>
</q-table>
</div>
</template>// useTable Hook 核心逻辑伪代码
// 接收一个获取列表的 API 函数,返回表格所需的一切状态
export function useTable < T > (apiFn: (params: any) => Promise < ApiResponse < T >> ) {
// 状态定义:将分散的变量内聚在一起
const loading = ref(false);
const dataList = ref < T[] > ([]);
const pagination = ref({
page: 1,
rowsPerPage: 10,
rowsNumber: 0
});
// 核心请求逻辑:统一处理 Loading、参数组装、分页回填
const onRequest = async (props: any) => {
const {
page,
rowsPerPage
} = props.pagination;
loading.value = true;
try {
// 自动组装分页参数与查询参数
const res = await apiFn({
page,
size: rowsPerPage,
...queryParams
});
// 自动回填数据与总条数
dataList.value = res.list;
pagination.value.rowsNumber = res.total;
// 更新分页器状态
pagination.value.page = page;
pagination.value.rowsPerPage = rowsPerPage;
} finally {
loading.value = false;
}
};
// 暴露出去给组件使用
return {
loading,
dataList,
pagination,
onRequest
};
}// 1. 定义配置 (Schema)
// 这里的配置决定了视图长什么样,修改这里比修改 HTML 更安全
const searchSchema = [
{ field: 'keyword', label: '搜索名称', type: 'input' },
{ field: 'status', label: '状态', type: 'select', options: [...] },
{ field: 'date', label: '创建时间', type: 'date-picker' }
];
// 2. 视图渲染 (Template)
// ComSearch 组件内部伪代码
<template>
<div class="row q-col-gutter-md">
<div v-for="item in searchSchema" :key="item.field">
<component
:is="getComponentType(item.type)"
v-model="formModel[item.field]"
:label="item.label"
v-bind="item.props"
/>
</div>
</div>
</template>©2026 Hejian
陕 ICP 备 2025072452 号-1