Skip to content

PageQueryTable

路径:frontend/src/components/table/page-query-table/PageQueryTable.vue

导出:import PageQueryTable from '@/components/table/page-query-table',类型见同目录 page-query-table.props.tspage-query-table.types.ts

封装目标

列表页常见结构固化为一层:

  1. 搜索区(可选):声明式字段配置,或 search-main / search-extra 插槽。
  2. 工具栏(可选):toolbar 插槽。
  3. 表格区:传入 columns + tableData 使用内置 NDataTable,或 #table 完全自定义。
  4. 分页区itemCount + v-model:page + v-model:page-size,或 #pagination 自定义。

布局与响应式(栅格列数、标签位置、断点)由 usePageQueryTable 计算,样式类名以 pqt- / page-query-table 为前缀。

与模型的绑定(defineModel)

绑定说明
v-model:query搜索表单双向绑定对象,字段名与 searchFields[].key 一致
v-model:expanded「展开」区是否展开(有 searchFieldsExtrasearch-extra 时)
v-model:page当前页码
v-model:pageSize每页条数

声明式搜索:searchFields / searchFieldsExtra

每一项为 PageSearchFieldpage-query-table.types.ts):

字段说明
key对应 query 上的属性名
label表单项标签
typeinput(默认)、selectdaterange
optionstype === 'select' 时的 Naive SelectOption[]
placeholder占位符
clearable默认 true
valueFormatdaterange 时传给日期控件的格式化串

主区字段放在 searchFields;额外字段放在 searchFieldsExtra,主区旁会出现「展开 / 收起」。

主要 props(节选)

完整定义见 page-query-table.props.ts

Prop默认值说明
colsPerRow3每行搜索项列数;会与断点上限合并(窄屏列数变少)
stickySearchfalse搜索卡片 position: sticky 顶吸
filltrue是否占满父级 flex 高度(表格区域可滚动)
searchLabelWidth88搜索表单项标签宽度(非 xs)
columnsNaive DataTableColumns
tableData[]表格数据
loadingfalse加载中
rowKey'id'行主键字段名或函数
itemCount总条数;与内置分页同时使用时必传
pageSizes[10,20,50]分页可选每页条数
formFeedbackHeight0表单项校验提示高度 CSS 变量,紧凑为 0
responsivetrue是否按断点压缩列数
tableMinHeight表格外包层最小高度(数字视为 px)
tableMaxHeightNDataTablemax-height,超出后表体滚动

事件

事件说明
search点击默认「查询」
reset点击默认「重置」(仅发事件,不自动清 query,由页面处理)

插槽

插槽说明
search-main未配置 searchFields 时自定义主搜索区
search-extra展开区自定义(可与 searchFieldsExtra 二选一逻辑见源码)
search-actions覆盖默认「查询 / 重置 / 展开」按钮
toolbar表格上方右侧工具区
table完全自定义表格(此时忽略内置 NDataTable
pagination完全自定义分页

典型用法(声明式 + useListFetch)

useListFetch 配合时,将 searchParampagepageSizedisplayRows(或 tableData)、getLoadingitemCount 绑定到表格即可。示例(节选):

vue
<script setup lang="ts">
import PageQueryTable, { type PageSearchField } from '@/components/table/page-query-table';
import { useListFetch } from '@/composables/list';
import type { DataTableColumns } from 'naive-ui';

const searchExpanded = ref(false);
const { displayRows, getLoading, searchParam, search, reset, page, pageSize, pageable, getTableList } =
  useListFetch({ /* ... */ });

const searchFields: PageSearchField[] = [
  { key: 'name', label: '名称', type: 'input' },
];

const columns: DataTableColumns = [/* ... */];

onMounted(() => getTableList());
</script>

<template>
  <PageQueryTable
    v-model:query="searchParam"
    v-model:expanded="searchExpanded"
    v-model:page="page"
    v-model:page-size="pageSize"
    :search-fields="searchFields"
    :columns="columns"
    :table-data="displayRows"
    :loading="getLoading"
    :item-count="pageable.total"
    @search="search"
    @reset="reset"
  />
</template>

子组件:PageQueryTableSearchForm

文件:PageQueryTableSearchForm.vue

不单独对外导出为公共 API,由 PageQueryTable 在声明式模式下使用。内部通过 useQueryModelFields 读写 queryinput/select 用字符串,daterange 用长度为 2 的数组(与 PageSearchField 一致)。

TaskFlow 内部文档 Released under the MIT License.