高级列表
本节介绍Jiess基础库中的两个列表组件:JiessTable
和SuperTable
准备工作
首先需要将 JiessTable 和 SuperTable 注册为Jiess全局组件
// jiessConfig/index.js
import { $component } from '@jiess/plus';
import { $SuperTable, $JiessTable } from '@/.jiess';
$component($JiessTable.name, $JiessTable);
$component($SuperTable.name, $SuperTable);
JiessTable
JiessTable组件分别基于element-ui,element-plus和ant-design中的table组件封装
构建列表
对JiessTable组件提供表头配置函数(对象)items
,可渲染列表表头; 若提供列表数据datas
(该属性可选),即可渲染完整列表;此外,JiessTable还有以下特点:
midder对象
每个JiessTable都会构建独有的中介者(midder对象), 可将列表表体,分页区,筛选区,串联起来;承担表内数据通信和事件交互的功能
表内生命周期
创新性的将生命周期融入到了列表渲染中,以方便各阶段的事务处理
- create:初始创建阶段,可进行数据初始化,准备数据
- mounte:列表渲染完毕的回调,可进行表体数据的加载
- render:列表的渲染过程,在此对表体,筛选区,分页区进行布局和整体把控
- update:列表需要更新时的回调,控制表体数据的加载过程
形参 midder
生命周期均需要提供一个函数,在这里需要特别说明的是:对于上述生命周期函数, 它们的第一个形参,均为midder对象,实现了将整个列表串联
列表数据响应式
在JiessTable的midder对象中,会注入proxy
属性,它是Jiess响应式对象, 使用proxy
便可以更新对应的表体数据,分页数据,控制三块区域的渲染和数据提取
- proxy.datas:列表表体数据
- proxy.columns:列表表头数据
- proxy.currentPage:当前分页页码
- proxy.pageSize:每页展示数据的条数
- proxy.total:分页中展示列表的总条数
- proxy.pageSizes:size切换器的选项
element中:
- proxy.layout:布局控制
antd中:
- proxy.showSizeChanger:是否显示size切换器
- proxy.showQuickJumper:分页布局控制
快速上手
下面介绍JiessTable组件的快速上手使用
使用JiessTable组件
注:Jiess全局组件,仅能在Jiess环境中使用
// setup函数中(jiess环境下)
import items from './items.js';
function setup() {
this.add(
this.render({
//直接使用全局注册的组件名即可
is: 'JiessTable',
items: items,
render(midder,{ table, pager }) {
// 此处自定义布局控制
this.add(table, pager);
}
})
)
}
注:render和items为必要参数
上例中JiessTable已全局注册,所以is使用字符串即可
JiessTable组件配置属性
以下是JiessTable组件中通常用到的属性
items
- 类型
Function|Array
- 参数 (midder ,itemsParam)
- 必要
true
- 返回
- 详细
用于列表表头的配置,掌控列表整体的渲染
// items为数组
const items = [
{ prop: 'name', label: '姓名' },
{ prop: 'gender', label: '性别' },
{ prop: 'age', label: '年龄' }
];
// items为function
const items = function(midder){
return [
{ prop: 'name', label: '姓名' },
{ prop: 'gender', label: '性别' },
{ prop: 'age', label: '年龄' }
]
}
datas
- 类型
Array
- 必要
false
- 返回
- 详细
初始化列表表体的数据
const datas = [
{ key: 'id_1', name: '小明', gender: '男', age: 16 },
{ key: 'id_2', name: '小强', gender: '男', age: 18 },
{ key: 'id_3', name: '小红', gender: '女', age: 17 }
];
create
- 类型
Function
- 参数 (midder)
- 必要
true
- 返回
- 详细
在列表构建构建好midder实例并做好对初始数据的解析以后调用
create(midder) {
// 用于对midder注入初始数据,如 列表http请求注入静态数据
}
render
- 类型
Function
- 参数 (midder, { table, pager })
- 必要
true
- 返回
- 详细
在构建好列表内部table组件和pager组件后调用
render(midder, { table, pager }) {
// 可以在此处进行组黄和布局,决定了最终的渲染
}
mounte
- 类型
Function
- 参数 (midder)
- 必要
false
- 返回
- 详细
列表已经准备渲染完毕时调用
mounte(midder) {
// 列表渲染完毕的回调,可进行表体数据的加载
midder.table.reload();
}
示例为列表加载完毕后,通知获取列表表体数据
update
- 类型
Function
- 参数 (midder)
- 必要
false
- 返回
promise
- 详细
update: async (midder) => {
const httpApi = 模拟接口;
// 列表需要更新时的回调,控制表体数据的加载过程
const { proxy, filter, table } = midder;
// filter.values:筛选区参数,table.values:列表静态参数,
const res = await httpApi({ ...filter.values, ...table.values });
// 更新表体数据
proxy.datas = res.datas;
// 更新当前页码
proxy.currentPage = res.page || 1;
}
示例为用接口获取列表数据,并响应式更新列表和分页渲染,由reload
触发
列表请求参数
- Jiess基础库提供的TableFilter组件,会自动在midder上挂载filter实例, 其中筛选区的数据会存储在filter.values,它会随着筛选区表单数据的变化而自动更新
- 对于静态的,无需变化的列表请求参数,如Id等,放入table.values中
- 为了方便封装,建议您在自定义筛选组件或存放静态数据时也遵循此规则
JiessTable实例方法
构建JiessTable时,会在midder上挂载table实例,下面介绍其暴露出来的方法
reload
- 类型
Function
- 参数 无
- 返回 无
- 详细 触发update生命周期,触发列表渲染
调用reload()
且时便会执行update生命周期,通知列表的更新
SuperTable
SuperTable是基于JiessTable的封装,封装了接口请求,使用更方便
- 内置了通用列表布局,按照筛选区,列表主体,分页区,从上至下排布
- 将筛选区,列表主体,分页区,以及编辑和新增融为一体,统一管控
- 使用接口获取列表数据,并自动管理列表的数据加载
使用SuperTable组件
注:Jiess全局组件,仅能在Jiess环境中使用
// setup函数中(jiess环境下)
import items from './items.js';
function setup() {
this.add(
this.render({
//直接使用全局注册的组件名即可
is: 'SuperTable',
items: items,
HttpApi: Promise接口
})
)
}
注:HttpApi和items为必要参数
SuperTable组件配置属性
items
- 类型
Function|Array
- 参数 (midder ,itemsParam)
- 必要
true
- 返回
- 详细
用于列表表头的配置,掌控列表整体的渲染
// items为数组
const items = [
{ prop: 'name', label: '姓名' },
{ prop: 'gender', label: '性别' },
{ prop: 'age', label: '年龄' }
];
// items为function
const items = function(midder){
return [
{ prop: 'name', label: '姓名' },
{ prop: 'gender', label: '性别' },
{ prop: 'age', label: '年龄' }
]
}
注:与JiessTable完全一致
datas
- 类型
Array
- 必要
false
- 返回
- 详细
初始化列表表体的数据
const datas = [
{ key: 'id_1', name: '小明', gender: '男', age: 16 },
{ key: 'id_2', name: '小强', gender: '男', age: 18 },
{ key: 'id_3', name: '小红', gender: '女', age: 17 }
];
注:与JiessTable完全一致
httpApi
- 类型
JiessApi|Promise
- 必要
false
- 详细
提供一个接口,组件会在初始加载,筛选及分页交互时自动发起请求
TableFilter
- 类型
Jiess组件
- 必要
false
- 详细 用于展示筛选区的组件,不提供则无筛选区
initLayout
- 类型
Function
- 上下文
SuperTableContext
- 形参
(midder, filterNode, tableNode)
- 返回 重新组装后的
jiessNode
- 详细 将筛选区和列表主体进行定制化的组装
param
- 类型
Object
- 必要
false
- 详细 综合参数的集合,详情见下表
注:其余属性作为JiessTable组件的直接属性
param 综合参数
下面表格中综合列举param中的属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
title | String | 列表 | 列表左上标题 |
primaryKey | String | id | 列表键名对应字段 |
initLayout | Function | —— | 初始化整体布局 |
initExtra | Function | —— | 初始化列表右上 |
cardParam | Object | —— | 布局容器参数 |
filterParam | Object | —— | 列表筛选区参数 |
updateType | String | listUpdate | 列表更新方案,可选listUpdate/tableUpdate |
isCard | Boolean | —— | 列表是否被Card包裹 |
isPager | Boolean | true | 默认带分页 |
isCheckbox | Boolean | true | 默认带复选框 |
immedicat | Boolean | true | 初始是否加载列表 |
httpTag | string | —— | loading的加载标记 |
httpField | string | list | 调用接口集合中的方法名 |
httpConver | Function | —— | 处理请求到的数据,并返回新的列表数据 |
pagerBoxParam | Object | —— | 分页容器参数 |
tableBoxParam | Object | —— | 列表容器参数 |
selectionParam | Array | [] | 复选参数配置,仅适用于react |
其余属性 | —— | —— | 作为原框架的table组件的参数 |
SuperTable生命周期
SuperTable在JiessTable生命周期的基础上进行了扩展
- beforeCreate:初始创建阶段,数据还未准备
- created:初始创建阶段,数据刚准备完毕
- beforeMounte:列表渲染完毕的回调,可进行表体数据的加载
- mounte:列表刚渲染完毕,但还未发起表体更新
- mounted:列表刚渲染完毕,并已经发起表体更新
- render:列表的渲染过程,在此对表体,筛选区,分页区进行布局和整体把控
- beforeUpdate:列表需要更新时的回调,但还未发起表体更新
- updated:列表需要更新时的回调,并已经发起表体更新
基于SuperTable的TableFilter列表
使用通用筛选组件,通过接口调用,实现完整的增删改查
基于SuperTable的ExpandFilter列表
使用可展开筛选区组件,通过接口调用,实现完整的增删改查
注:可展开组件目前仅支持vue-element环境