logo TableRender

npm NPM downloads NPM all downloads PRs Welcome

易用且轻量的中后台列表解决方案,常用于搜索列表页快速生成

简介

  1. 真正开箱即用:以最简单的 API 配置请求和表头的字段,就能生成一个好用搜索列表。
  2. XRender 生态:搜索筛选能力用 FormRender 来提供,以最小成本快速生成上侧搜索面板。
  3. 无缝习惯使用:表格能用 Ant Design Table 来提供,降低用户使用成本。

安装

table-render 依赖 ant design,单独使用不要忘记安装~

  1. npm i table-render --save

代码演示

  1. /**
  2. * transform: true
  3. * defaultShowCode: false
  4. * background: 'rgb(245,245,245)'
  5. */
  6. import React from 'react';
  7. import { Table, Search, withTable } from 'table-render';
  8. const dataSource = [];
  9. for (let i = 0; i < 6; i++) {
  10. dataSource.push({
  11. id: i.toString(),
  12. title: `标题${i + 1}`,
  13. created_at: new Date().getTime(),
  14. });
  15. }
  16. // 详细可见 form-render 的使用
  17. const schema = {
  18. type: 'object',
  19. properties: {
  20. title: {
  21. title: '标题',
  22. type: 'string',
  23. width: '30%',
  24. labelWidth: 45
  25. },
  26. created_at: {
  27. title: '创建时间',
  28. type: 'string',
  29. format: 'date',
  30. width: '30%',
  31. },
  32. },
  33. };
  34. // 配置完全透传 antd table
  35. const columns = [
  36. {
  37. title: '标题',
  38. dataIndex: 'title',
  39. },
  40. {
  41. title: '创建时间',
  42. key: 'since',
  43. dataIndex: 'created_at',
  44. valueType: 'date',
  45. },
  46. {
  47. title: '操作',
  48. render: (row, record) => <a onClick={() => alert(row.title)}>编辑</a>,
  49. },
  50. ];
  51. const Wrapper = () => {
  52. const searchApi = () => {
  53. return {
  54. rows: dataSource,
  55. total: dataSource.length,
  56. };
  57. };
  58. return (
  59. <>
  60. <Search schema={schema} api={searchApi} />
  61. <Table headerTitle="最简表格" columns={columns} rowKey="id" />
  62. </>
  63. );
  64. };
  65. export default withTable(Wrapper);

API

WithTable

TableRender 在底层使用了 Context 管理内部状态,withTable 是 Context Provider 高阶组件形式的语法糖,用户需要使用 withTable 包裹表格组件

  1. import { withTableuseTable } from 'table-render';
  2. const Page = () => {
  3. const { refresh } = useTable();
  4. }
  5. export default withTable(Page)

Search

我们将搜索相关的能力放到 <Search /> 上面配置,包括对应的搜索筛选表单的渲染

属性 描述 类型 默认值
schema 必填,用于渲染查询表单,详见form-render 文档 SchemaBase -
api 必填,初始化&点击查询时执行的函数,详见Api ApiType -
onSearch 在表格查询时执行一些额外的操作 (params) => void -
afterSearch 在表格查询结束后执行一些额外的操作 (params) => void -
searchOnMount 组件初次挂载时,是否默认执行查询动作 boolean true
hidden 是否隐藏 <Search /> 组件 boolean false
searchBtnRender 自定义表单查询按钮 (refresh,clearSearch) => ReactNode[] -
searchBtnStyle 自定义表单操作按钮组的样式 CSSProperties -
searchBtnClassName 自定义表单操作按钮组的 ClassName string -
searchWithError 表单校验失败时,是否继续执行查询操作 boolean true
searchText 自定义查询按钮的文本 string 查询
resetText 自定义重置按钮的文本 string 重置
debug 开启 debug 模式,时时显示内部状态,开发的时候强烈建议打开 boolean false

Api

api 有两个入参:paramssorter,分别是表单筛选项的值、排序参数。api 需要返回一个对象,此对象中必须要有 rowstotal。 表单查询时 api 会被自动调用,同时带入最新的表单值和其他查询参数

```jsx | pure const searchApi = async (params, sorter) => { const result = await getTableData(params, sorter);

return { rows: result.list, // rows 对应表格的 tableSource,必须返回 total: result.total, // total 对应数据的总数,用于分页,必须返回 } }

  1. 可以通过数组形式传入多个 `api` 函数,Table-Render 会自动生成对应的 tab
  2. ```jsx | pure
  3. const searchHotel = async (params) => {
  4. const result = await getHotelData(params);
  5. return {
  6. rows: result.list,
  7. total: result.total,
  8. }
  9. }
  10. const searchPeople = async (params) => {
  11. const result = await getPeopleData(params);
  12. return {
  13. rows: result.list,
  14. rows: result.totla,
  15. }
  16. }
  17. // 需要额外的 name 属性,作为 tab 的名称
  18. <Search
  19. api={[
  20. { name: '酒店数据', api: searchHotel },
  21. { name: '人员数据', api: searchPeople },
  22. ]}
  23. />

Table

支持所有 antd table 的 props,但是dataSource, loading, pagination这几个参数是内部状态,不需要填写

属性 描述 类型 默认值
headerTitle 表格标题 `string \ ReactNode` - -
toolbarRender 表格主体右上方的控件,例如“添加”按钮 () => ReactNode[] false
toolbarAction 显示在表格主体右上方的 Icon 列表,内置了刷新、调整密度、全屏显示等功能 boolean false
pageChangeWithRequest 切换分页时是否需要请求接口 boolean true
columns 列定义 ProColumnsType -
debug 开启 debug 模式,时时显示内部状态,开发的时候强烈建议打开 boolean false

Columns

columns 为 antd 已有的 props,支持 antd 所有的 columns 配置,同时也提供了一些更方便的 api,加快书写

属性 描述 类型 默认值
ellipsis 是否自动缩略 boolean -
copyable 是否支持复制 boolean -
valueType 值的类型,详见 ValueType `’text’ \ ‘money’ \ ‘date’ \ ‘dateTime’` text
enum 当前列值的枚举,详见Enum object -

ValueType

TableRender 封装了一些常用的值类型来减少重复的 render 操作,配置一个 valueType 即可展示格式化响应的数据

属性 描述
text 普通的文本类型
date 当数据是日期类型的返回时,会自动将格式转换为 YYYY-MM-DD
dateTime 当数据是日期类型的返回时,会自动将格式转换为 YYYY-MM-DD HH:mm:ss
money 当数据是金额时,会自动将格式转换为 ¥0,0.00
  1. const columns = [
  2. {
  3. title: '酒店GMV',
  4. dataIndex: 'money',
  5. valueType: 'money', // 自动将格式转换为 '¥0,0.00'
  6. },
  7. {
  8. title: '成立时间',
  9. dataIndex: 'created_at',
  10. valueType: 'date', // 自动将格式转换为 'YYYY-MM-DD'
  11. },
  12. // ...
  13. ]

Enum

当前列值的枚举,方便处理表格值的映射

  1. const columns = [
  2. {
  3. title: '酒店状态'
  4. dataIndex: 'state',
  5. enum: {
  6. open: '营业中', // 自动将 open 转换为 营业中
  7. closed: '已打烊', // 自动将 closed 转换为 已打烊
  8. },
  9. },
  10. // ...
  11. ]

UseTable

可通过 useTable 获取如下 table-render 的 context

属性 描述 类型
tableState 这些是全局的状态,根据需要使用 TableStateType
refresh 刷新表格数据,详见Refresh (config, search) => Promise<void>
setTable 用于修改全局状态的工具函数,setTable 之于 tableState,等同 setState 之于 state (tableState) => void
changeTab 手动切换 tab 的函数,例如目前两个搜索 tab: “我的活动”,“全部活动” (分别对应 tab 值为 0 和 1),详见ChangeTab (tab) => void
form Search 组件是 form-render 生成的,可以取到搜索表单的 form 实例以及挂在上面的方法,例如 form.resetFields 清空搜索项 object

导出 useTable 以及对应的方法

  1. import { useTable } from 'table-render';
  2. const { refresh, tableState, setTable } = useTable();

TableState

表单的全局状态 tableState 包含的如下的数据

  1. {
  2. loading: false, // 表单是否在加载中
  3. search: {}, // 选项数据
  4. searchApi, // 搜索用的api
  5. tab: 0, // 如果 searchApi 为多个,会自动生成相应个数的 tab,这里代表的是当前的 tab 的 key
  6. dataSource: [], // 表格的数据
  7. extraData: { }, // 自定义的扩展信息
  8. pagination: {
  9. current: 1, // 当前页码
  10. pageSize: 10, // 当前页数
  11. total: 100, // 总数
  12. },
  13. }

Refresh

主动触发表单刷新的方法

  1. type Refresh = (
  2. config?: {
  3. stay: boolean, // 刷新之后是否停留在目前的页码上,默认 false,回到第一页
  4. tab: number // searchApi 有多个时,用于强制搜索某个 tab 对应的 searchApi
  5. },
  6. search?: any // 额外传递给 searchApi 的参数
  7. ) => Promise<void>;
  8. const { refresh } = useTable();
  9. const onClick = () => {
  10. refresh({ stay: true }); // 刷新数据,但停留在现有的页码
  11. }

ChangeTab

手动切换当前 tab 的方法

  1. type ChangeTab = (
  2. tab: number
  3. ) => Promise<void>;
  4. const { changeTab } = useTable();
  5. const onClick = () => {
  6. changeTab(1); // 手动切换到对应tab
  7. };