Skip to content

useGrid

useGrid 聚合 ElFormElTableElPagination,通过一个 Controller 管理查询条件、表格数据和分页状态。调用方负责请求数据,并通过 setDataloadData 更新表格。异步加载数据时,会自动处理 Loading。

基础用法

columns 用于设置表格列,data 用于设置初始数据。传入 pagination 后会显示分页器。分页变化只会更新内部状态并触发事件,调用方需在事件中使用 loadData 加载数据。

  • 1
  • 2

查询表单

传入 form 配置即可显示查询表单。调用加载函数时,loadData 会传入表单模型和分页参数。loadData 执行异步加载函数时会显示 Loading,函数结束后会关闭 Loading。

表单插槽会接收 loading 参数,调用方可以使用该参数控制自定义按钮。加载状态不会遮挡表单区域。

Approved by
Activity zone
Activity zone
  • 1
  • 2

自定义数据映射

Grid 会根据数据自动设置总条数。数据为数组时使用数组长度,数据为对象时默认读取 resulttotal 字段。pagination.props 可以将其他响应字段映射为这两个字段。

暂无数据

数据更新

setData 直接写入数据,也支持函数式更新。loadData 调用同步或异步加载函数,并将返回值写入数据。

ts
setData(rows);

setData(data => (Array.isArray(data) ? [...data, row] : [row]));

loadData(params => getRows(params));

await loadData(async params => {
  const response = await getRows(params);
  return response;
});

每次调用 loadData 时,传入的加载函数只会执行一次。分页变化不会自动重新执行之前的加载函数。传入 form 时,加载函数的参数包含表单模型和分页参数,未传入 form 时,参数只包含 currentPagepageSize。有表单且需要显式声明行类型时,应同时声明 DM。不写泛型时,DM 会分别从 dataform.model 推导。分页字段会覆盖表单中的同名字段。currentPagepageSize 未配置时采用 ElPagination 的默认值。

GridData<D> 也可以接收对象形式的响应。响应对象可以使用 interfacetype 定义,无需声明字符串索引签名。

需要串行加载时,调用方应逐次 await loadData(...)

[加载范围]

加载函数返回 PromiseLike(包括 Promise)时,页面才会显示加载状态。加载状态仅覆盖表格区域,并在加载期间禁用分页,函数结束后会自动关闭。错误会继续向调用方抛出。useGrid 不负责消息提示或重试。

API

Options

useGrid 支持 ElTable 的属性,并增加以下配置。

GridOptions<D> 不包含表单配置。使用表单时应声明为 GridOptions<D, M>,此时 form 为必填项。未提供具体行类型时,D 默认使用 object,传入空数组不会将行类型固定为 never

参数说明类型默认值
data表格数据,可以是数组或包含结果及总数的对象GridData<D>-
columns表格列配置TableColumn<D>[][]
form表单配置,参考 useFormFormOptions<M>-
pagination分页配置,参考 ElPaginationPaginationOptions-

PaginationOptions 不包含 totalpageCountdefaultCurrentPagedefaultPageSize。Grid 根据数据管理总条数,ElPagination 会结合 pageSize 计算总页数。初始页码和每页条数可以通过 currentPagepageSize 设置。

可以通过 app.use(ElementHooks, { pagination }) 设置全局分页默认项。

TIP

传入 pagination 时,局部分页配置会与全局 pagination 配置合并。

Controller

成员说明类型
setState更新 Grid 的整体状态(state: GridOptions<D, M> | ((prev: GridOptions<D, M>) => GridOptions<D, M>)) => void
setData更新表格数据(data: GridData<D> | ((prev: GridData<D>) => GridData<D>)) => void
loadData执行一次同步或异步数据加载(loader: GridDataLoader<D, M>) => void | Promise<void>
setModel更新或初始化表单模型数据(model: M | ((prev: M) => M)) => void
getModel获取当前表单数据() => M | null
setItems更新表单项配置(items: FormItem<M>[] | ((prev: FormItem<M>[]) => FormItem<M>[])) => void
setColumns更新表格列配置(columns: TableColumn<D>[] | ((prev: TableColumn<D>[]) => TableColumn<D>[])) => void
getData获取当前表格渲染的数据() => D[]
getPagination获取当前页码和每页条数() => GridPaginationParams
instance表单、表格和分页实例Ref<GridInstance | null>

模型尚未初始化时,setModel 只能直接传入模型对象。