# 通用表格组件
**Repository Path**: tanh-coding/generalTable
## Basic Information
- **Project Name**: 通用表格组件
- **Description**: 通用表格组件
- **Primary Language**: HTML
- **License**: CC-BY-SA-4.0
- **Default Branch**: master
- **Homepage**: https://www.zjh336.cn/generalTable
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 6
- **Created**: 2022-07-04
- **Last Updated**: 2022-07-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 通用表格组件
[在线预览](https://www.zjh336.cn/generalTable)
## 一、组件概览以及背景
在数据表格报表设计和医嘱任务表格设计的需求背景下,诞生了通用表格组件。该组件主要用于解决自定义表格的设计以及动态渲染,可支持较为灵活的自定义样式配置。该组件是报表表格组件的升级版,移除部分定制功能,将个性功能抽离支持扩展,保留公共的基础功能,以便于后续的扩展。
## 二、组件设计思路
1、核心思想:开发组件的目的就是提高开发效率,避免重复造轮子,将类似的功能通用化。
2、无论是数据报表,还是医嘱任务表格,又或者以后还有扩展需求,实际上都是先做表格设计,然后再做数据渲染。确定大方向,一个表格设计组件、一个表格渲染组件。
3、表格设计也可以抽象,分为三个部分,一个表格的数据来源处理,一个表格内容处理,一个表格属性处理。
4、数据来源部分,可以采用两级的树结构,支持拖拽数据,以及支持扩展功能,如增加图标显示,绑定事件。
5、表格内容部分,需要支持两种模式,一种简易模式,一种混合模式,以应对不同需求。
6、表格属性部分,支持表格属性的配置,以及单元格式属性的配置,以及一些扩展属性的配置。
7、表格渲染,根据设计组件生成的配置渲染出表格外观,再根据数据接口填充数据。
## 三、组件结构
### 1、目录结构图
```
├─GeneralTable #通用表格组件
│ │ generalTableConstant.js #配置常量
│ │ GeneralTableDesign.js #组件注册文件
│ │ GeneralTableDesign.vue #通用表格设计组件
│ │ GeneralTableRender.js #组件注册文件
│ │ GeneralTableRender.vue #通用表格渲染组件
│ │ generalTableUtils.js #表格工具方法
│ │
│ └─components
│ │ DataTree.vue #数据树组件
│ │ evol-input.vue #自定义输入框组件
│ │ TableProperties.vue #表格属性组件
│ │ right-key-menu.vue #右键菜单
│ │
│ ├─blendModeTable #混合模式表格组件
│ │ blendTable.vue #表格主体
│ │
│ └─easyModeTable #简易模式表格组件
│ easyTable.vue #表格主体
```
整个通用表格组件分为三大部分 表格设计组件部分、表格渲染组件部分、依赖组件部分
表格设计组件:由三块区域组成,左侧数据区域(数据树组件)、中间表格区域(混合模式表格组件/简易模式表格组件,自定义输入框组件,右键菜单组件)、右侧表格属性区域(表格属性组件)
表格渲染组件:仅由表格区域组成(混合模式表格组件/简易模式表格组件,自定义输入框组件)
依赖组件部分:数据树组件、混合模式表格组件、简易模式表格组件、自定义输入框组件、右键菜单组件、表格属性组件
### 2、组件页面效果图


## 四、组件功能及实现
### 1、表格设计组件
#### 1.1 属性绑定(v-bind)
| 参数编码 | 参数名 | 必 填 | 参数描述 | 数据类型 | 示例 |
| ---------------------- | -------------------- | ------ | ------------------------------------------------------------ | -------- | ------------------------------------------------------------ |
| dataTree | 树数据 | 是 | 传入树结构的数据,其中:
label为标题;
key为字段编码;
dataSetCode表示数据集编码;
resultType表示结果类型,1表单条数据,2表示多条数据;
children表示子节点数据。
firstNode为一级节点标志;
其中部分字段编码可自定义,参考以下参数 | array | [{ 'label': '单条数据', 'firstNode': true, 'children': [{ 'label': '二级标题(单条)', resultType: 1, dataSetCode: 'code1', key: 'key1' }, { 'label': '二级标题2(单条)', resultType: 1, dataSetCode: 'code2', key: 'key2' }] }, { 'label': '多条数据', 'firstNode': true, 'children': [{ 'label': '二级标题3(多条)', resultType: 2, dataSetCode: 'code3', key: 'key3' }] }] |
| treeFirstNode | 第一级节点标志 | 否 | 树节点以什么字段区分第一级 | string | firstNode |
| treeDefaultProps | 数据树默认配置 | 否 | 自定义children节点和label节点 | object | {children:'children',label:'label'} |
| tablePropertyHidden | 需要隐藏的表格属性 | 否 | 隐藏部分表格属性值 | array | [] |
| cellPropertyHidden | 需要隐藏的单元格属性 | 否 | 隐藏部分单元格属性值 | array | [] |
| screenHeight | 除去标题的高度 | 否 | 控制组件高度,实现滚动粘性布局 | int | 700 |
| tableMode | 表格模式 | 是 | 表格组件模blend混合模式、easy简易模式 | string | blend |
| tableContentBackground | 表格内容背景色 | 否 | 表格组件的背景色 | string | ‘#00000000’ |
| saveMappingFunction | 保存映射关系的方法 | 否 | 自定义保存映射关系的方法(使用场景如:医嘱任务表格,输入项与拖入项建立映射关系) | function | (selectCells, renderTBodyData)=>{} |
#### 1.2 事件绑定(v-on)
| 事件名 | 回调参数 | 参数说明 | 事件说明 |
| ------------- | -------- | ------------------------------------------------------------ | ---------------------------------- |
| targetDropEnd | object | { renderTBodyData, content, selectFlag }表格数据,拖拽内容,单元格标记 | 拖拽回调:用于拖拽数据后的事件处理 |
| clearContent | object | { renderTBodyData, selectCellsData }表格数据,选中的单元格 | 清空内容:用于清空内容后的事件处理 |
#### 1.3 插槽(slot)
| 插槽名 | 参数 | 参数说明 | 插槽说明 |
| ------------------------- | ------------ | ------------------------------------------------------------ | -------------------------------------------- |
| tableFirst | parentData | {belong} 所属类型(一级节点的label) | 一级菜单按钮:一级树节点 右侧按钮 |
| tableSecond | childrenData | {data,bleong} 节点数据(二级节点数据) ,所属类型(一级节点的label) | 二级菜单按钮:二级树节点 右侧按钮 |
| tableExtendedPropertyTop | data | {tableProperty} 表格属性 | 表格扩展属性顶部区域:位于顶部的表格扩展属性 |
| tableExtendedProperty | data | {mode,treeData} 表格模式,树数据 | 位于底部的表格扩展属性 |
| cellTableExtendedProperty | data | {mode,treeData,cellProperty} 表格模式,树数据,单元格属性 | 单元格扩展属性:单元格的扩展属性 |
#### 1.4 核心方法(function)
##### 1.4.1暴露给外部调用
| 方法名 | 参数描述 | 方法描述 |
| --------------------------- | ----------------------------------------------------- | --------------------------- |
| componentInit(tableJson) | {Object} tableJson 表格配置json字符串 | 根据tableJson进行组件初始化 |
| getTableJSON() | / | 向外提供获取表格json的方法 |
| operateHistory(operateType) | operateType 操作类型 撤销(repeal) 或者 还原(restore) | 操作历史记录 |
##### 1.4.2内部核心方法
| 方法名 | 参数描述 | 方法描述 |
| ----------------------------------------------------- | ------------------------------------------------------------ | ----------------------------- |
| getTableRef() | / | 根据当前模式获取表格组件的ref |
| getTablePropertiesRef() | / | 获取表格属性组件的ref |
| setTable(options) | {Object} options generalTableConstant.TABLE_OPTIONS | 创建表格 |
| changeTableSeting(e) | {Object} e {type:'',data:{}} | 表格和单元格的状态切换 |
| changeTableOptions(e) | {Object} e {key:'',value:''} | 单个表格属性重新赋值 |
| changeTableExtendOptions(e) | {Object} e {key:'',value:''} | 单个表格扩展属性重新赋值 |
| changeCellOptions(e) | {Object} e {key:'',value:''} | 单个单元格属性重新赋值 |
| tableJsonChange({ oldTableJsonObj, newTableJsonObj }) | oldTableJsonObj 修改前表格json配置
newTableJsonObj 修改后表格json配置 | 表格json对象变化 触发 |
#### 1.5 核心功能说明
##### 1.5.1 tableJson格式(不含数据项)
```json
{
"data": {
"tdData": [
[{
"val": "手写内容",
"rowspan": 1,
"colspan": 1,
"key": "",
"cellType": "text",
"label": "",
"otherVal": "",
"otherSelect": false,
"isRemove": false,
"isEditCell": false,
"size": "中",
"isColorChange": false,
"color": "rgba(20, 0, 0, 1)",
"isWeight": false,
"isItalic": false,
"underline": false,
"align": "中",
"valign": "中",
"cellFill": "rgba(254, 254, 254, 1)",
"topBorderColor": "",
"bottomBorderColor": "",
"leftBorderColor": "",
"rightBorderColor": "",
"isShow": true,
"selectFlag": "td-0-0-1-1"
}, {
"val": "",
"rowspan": 1,
"colspan": 1,
"key": "",
"cellType": "text",
"label": "",
"otherVal": "",
"otherSelect": false,
"isRemove": false,
"isEditCell": false,
"size": "中",
"isColorChange": false,
"color": "rgba(20, 0, 0, 1)",
"isWeight": false,
"isItalic": false,
"underline": false,
"align": "中",
"valign": "中",
"cellFill": "rgba(254, 254, 254, 1)",
"topBorderColor": "",
"bottomBorderColor": "",
"leftBorderColor": "",
"rightBorderColor": "",
"isShow": true,
"selectFlag": "td-0-1-1-1"
}]
]
},
"options": {
"color": "rgba(166,208,242,1)",
"headRowNum": 0,
"bodyRowNum": 1,
"colNum": 2,
"rowMax": 50,
"colMax": 50,
"headerFill": "#F9FAFB",
"cellFill": "rgba(255, 255, 255, 0)",
"rowBorderColor": "rgba(37,58,101,1)",
"colBorderColor": "rgba(37,58,101,1)",
"heightAdaptive": false,
"isSelect": true,
"isPage": false,
"isFirstCreat": false,
"isRowTotal": false,
"isColTotal": false,
"borderSize": "1",
"configMode": "custom",
"changeKey": ["configMode"]
},
"extendOptions":{
"previewThemeColorCode":"green"
}
}
```
##### 1.5.2 componentInit 组件初始化
表格设计组件初始化,调用componentInit方法,不传参数表示初始化默认表格,传入以上json字符串表示回显表格。方法内部调用子组件设置表格信息、表格属性、单元格属性。
##### 1.5.3 getTableJSON 获取表格JSON
获取调整后的表格json字符串,调用getTableJSON方法,返回以上json字符串。
##### 1.5.4 operateHistory 历史记录以及撤销还原功能实现
由于历史记录和撤销还原功能应当属于表格设计组件,所以就在这里进行了实现,但是触发逻辑应该在表格属性组件和表格内容组件中,所以此处提供tableJsonChange方法供其他组件调用。另外撤销与还原操作也应该是由其他组件触发,如提供按钮点击进行撤销或者还原,又或者是通过快捷键。所以提供了operateHistory方法给外部调用,直接传入参数operateType即可。
实现思路很简单,以队列的形式保存数据,每操作一步将数据记录一条,并且设置索引值,当达到上限,则覆盖已有记录。当进行撤销、还原操作时,按索引取出数据,进行回显。
历史记录数据中储存了,记录的时间,与上一次记录间隔的秒数,表格的json字符串,当与上一次记录时间未超过一秒时,直接覆盖最后一条历史记录,避免快速变化内容导致历史记录过多。
### 2、表格渲染组件
#### 2.1 属性绑定(v-bind)
| 参数编码 | 参数名 | 必 填 | 参数描述 | 数据类型 | 示例 |
| ---------------------- | -------------- | ------ | ------------------------------------------------------------ | -------- | ------------------------------------------ |
| tableMode | 表格模式 | 是 | 表格模式 easy 简易模式 blend 混合模式 | string | ‘blend’ |
| tableContentBackground | 表格内容背景色 | 否 | 表格组件的背景色 | string | '#00000000' |
| mappingFunction | 映射函数 | 否 | 两个单元格之间的映射关系函数 与表格设计组件中的保存映射关系相对应(使用场景如:医嘱任务表格,合计项映射关系,解析逻辑) | function | (item, singleDataMap, renderTBodyData)=>{} |
#### 2.2 事件绑定(v-on)
| 事件名 | 回调参数 | 参数说明 | 事件说明 |
| ------------ | -------- | ----------------------------------------------------- | ------------------------------------------ |
| dataComplete | object | { renderTHeadData, renderTBodyData }表头数据,表格数据 | 数据加载完成:用于数据加载完成后的逻辑处理 |
#### 2.3 核心方法(function)
##### 2.3.1 暴露给外部调用
| 方法名 | 参数描述 | 方法描述 |
| ----------------------------------------------------------- | ------------------------------------------------------------ | ---------- |
| initTable(tableJson, callBack) | tableJson 表格配置信息,callBack 回调函数 | 初始化表格 |
| resetTable() | / | 重置表格 |
| refreshData(multipleDataArray, singleDataMap, hiddenNoData) | multipleDataArray 多数据数组,singleDataMap 单数据map,hiddenNoData 是否隐藏无数据效果 | 刷新数据 |
##### 2.3.2 内部核心方法
| 方法名 | 参数描述 | 方法描述 |
| ------------- | -------- | ----------------------------- |
| getTableRef() | / | 根据当前模式获取表格组件的ref |
#### 2.4 核心功能说明
##### 2.4.1 tableJson格式(含数据项)
```json
{
"data": {
"tdData": [
[{
"val": "值(自定义项目)",
"rowspan": 1,
"colspan": 1,
"key": 105,
"cellType": "text",
"label": "自定义项目",
"otherVal": "",
"otherSelect": false,
"isRemove": false,
"isEditCell": false,
"size": "中",
"isColorChange": false,
"color": "rgba(20, 0, 0, 1)",
"isWeight": false,
"isItalic": false,
"underline": false,
"align": "中",
"valign": "中",
"cellFill": "rgba(254, 254, 254, 1)",
"topBorderColor": "",
"bottomBorderColor": "",
"leftBorderColor": "",
"rightBorderColor": "",
"isShow": true,
"selectFlag": "td-0-0-1-1",
"tag": "td",
"id": 105,
"materialId": 95,
"materialNo": "c-yzrw-202108281104013",
"titleName": "自定义项目",
"itemContent": "
自定义项目
", "updateUserId": "5bb2f84bde244a22841967f49ccd1e05", "updateUserName": "系统管理员", "updateTime": "2021-09-12 09:55:27", "deleteBit": false, "usedFlag": 1, "dataSetCode": "custom-105", "dataSetName": "自定义项目-自定义项目", "resultType": 1, "displayOrder": 0 }, { "val": "值(医嘱项目)", "rowspan": 1, "colspan": 1, "key": 229, "cellType": "text", "label": "医嘱项目", "otherVal": "", "otherSelect": false, "isRemove": false, "isEditCell": false, "size": "中", "isColorChange": false, "color": "rgba(20, 0, 0, 1)", "isWeight": false, "isItalic": false, "underline": false, "align": "中", "valign": "中", "cellFill": "rgba(254, 254, 254, 1)", "topBorderColor": "", "bottomBorderColor": "", "leftBorderColor": "", "rightBorderColor": "", "isShow": true, "selectFlag": "td-0-1-1-1", "tag": "td", "id": 229, "titleName": "医嘱项目", "materialId": 95, "materialNo": "c-yzrw-202108281104013", "orderCategory": "long,stat", "showType": "bedNo", "titleShowTotal": false, "deleteBit": false, "exitsMapping": true, "usedFlag": true, "dataSetCode": "execute-229", "dataSetName": "医嘱项目-医嘱项目", "resultType": 1, "displayOrder": 0 }, { "val": "值(二级护理)", "rowspan": 1, "colspan": 1, "key": 70, "cellType": "text", "label": "二级护理", "otherVal": "", "otherSelect": "", "isRemove": false, "isEditCell": false, "size": "中", "isColorChange": false, "color": "rgba(20, 0, 0, 1)", "isWeight": false, "isItalic": false, "underline": false, "align": "中", "valign": "中", "cellFill": "rgba(255, 255, 255, 0)", "topBorderColor": "", "bottomBorderColor": "", "leftBorderColor": "", "rightBorderColor": "", "isShow": true, "selectFlag": "td-0-2-1-1", "tag": "td", "id": 70, "titleName": "二级护理", "dataSetCode": "internal-70", "dataSetName": "内置项目-二级护理", "dataSetFieldCode": "twoLevel", "dataSetFieldName": "二级护理人数", "updateUserId": "5bb2f84bde244a22841967f49ccd1e05", "updateUserName": "系统管理员", "updateTime": "2021-09-08 16:21:53", "deleteBit": false, "typeId": 6, "titleShowTotal": true, "usedFlag": 1, "materialNo": null, "materialName": null, "typeName": "医嘱内置", "resultType": 1, "displayOrder": 0 }] ] }, "options": { "color": "rgba(22, 91, 147, 1)", "headRowNum": 0, "bodyRowNum": 1, "colNum": 3, "rowMax": 50, "colMax": 50, "headerFill": "#F9FAFB", "cellFill": "rgba(255, 255, 255, 0)", "rowBorderColor": "rgba(37,58,101,1)", "colBorderColor": "rgba(37,58,101,1)", "heightAdaptive": false, "isSelect": true, "isPage": false, "isFirstCreat": false, "isRowTotal": false, "isColTotal": false, "borderSize": "1", "configMode": "custom", "changeKey": ["color"] } } ``` ##### 2.4.2 singleDataMap数据 ```json { "custom-105": [{ "custom-105&105": "自定义项目
" }], "execute-229": [{ "execute-229&229": "01,09,12,16,18,33" }], "internal-70": [{ "internal-70&70": "1" }] } ``` ##### 2.4.3 multipleDataArray数据 ```json [{ "98ed2a4b-4d1e-41f8-8075-e302cf028c7b&levelName": "业务查房", "98ed2a4b-4d1e-41f8-8075-e302cf028c7b&sort": "1", "98ed2a4b-4d1e-41f8-8075-e302cf028c7b&id": "1" }, { "98ed2a4b-4d1e-41f8-8075-e302cf028c7b&levelName": "行政查房", "98ed2a4b-4d1e-41f8-8075-e302cf028c7b&sort": "2", "98ed2a4b-4d1e-41f8-8075-e302cf028c7b&id": "2" }, { "98ed2a4b-4d1e-41f8-8075-e302cf028c7b&levelName": "教学查房", "98ed2a4b-4d1e-41f8-8075-e302cf028c7b&sort": "3", "98ed2a4b-4d1e-41f8-8075-e302cf028c7b&id": "3" }] ``` ##### 2.4.4 initTable 表格初始化 表格组件初始化,调用initTable方法,传入表格json配置以及回调函数。回调函数常用于渲染完成表格后,立即加载数据。 ##### 2.4.5 resetTable 重置表格 使用空表格,重新渲染表格组件。 ##### 2.4.6 refreshData 刷新表格数据 加载表格数据,数据来源包括多数据数组、单数据map,可以支持隐藏无数据显示效果。表格配置的data.tdData中,数据单元格有dataSetCode字段以及key字段。 在singleDataMap中,dataSetCode与singleDataMap中的key值对应,singleDataMap的value值是一个只有一个元素的数组。元素对象的属性名就是dateSetCod+’&‘+key,属性值就是对应的数据。 在multipleDataArray中,每个元素的属性名都是由dataSetCode+’&‘+key组成,属性值就对应的数据。 组件内部调用的是tableSetValue方法 ### 3、数据树组件 #### 3.1 组件效果  第一个框为一级节点插槽,第二个框为二级节点插槽,如果设置了插槽,鼠标移入显示,移出隐藏 #### 3.2 属性绑定(v-bind) | 参数编码 | 参数名 | 必 填 | 参数描述 | 数据类型 | 示例 | | ------------ | -------------- | ------ | ------------------------------------------------------------ | -------- | ------------------------------------------------------------ | | title | 数据树标题 | 是 | 数据树标题 | string | '项目元素' | | dataTree | 树数据 | 是 | 传入树结构的数据,其中:自定义项目
", "id": 105, "initTitleName": "内置项目", "initItemContent": "内置项目
", "materialId": 95, "materialNo": "c-yzrw-202108281104013", "updateUserId": "5bb2f84bde244a22841967f49ccd1e05", "updateUserName": "系统管理员", "updateTime": "2021-09-12 09:55:27", "deleteBit": null, "dataSetCode": "custom-105", "dataSetName": "自定义项目-自定义项目", "resultType": 1, "displayOrder": 0 }], [{ "val": "内置项目", "rowspan": 1, "colspan": 1, "key": "", "cellType": "text", "label": "", "otherVal": "", "otherSelect": false, "isRemove": false, "isEditCell": false, "size": "中", "isColorChange": false, "color": "rgba(20, 0, 0, 1)", "isWeight": false, "isItalic": false, "underline": false, "align": "中", "valign": "中", "cellFill": "rgba(254, 254, 254, 1)", "topBorderColor": "", "bottomBorderColor": "", "leftBorderColor": "", "rightBorderColor": "", "isShow": true, "selectFlag": "td-2-0-1-1" }, { "val": "值(二级护理)", "rowspan": 1, "colspan": 1, "key": 70, "cellType": "text", "label": "二级护理", "otherVal": "", "otherSelect": false, "isRemove": false, "isEditCell": false, "size": "中", "isColorChange": false, "color": "rgba(20, 0, 0, 1)", "isWeight": false, "isItalic": false, "underline": false, "align": "中", "valign": "中", "cellFill": "rgba(254, 254, 254, 1)", "topBorderColor": "", "bottomBorderColor": "", "leftBorderColor": "", "rightBorderColor": "", "isShow": true, "selectFlag": "td-2-1-1-1", "tag": "td", "id": 70, "titleName": "二级护理", "dataSetCode": "internal-70", "dataSetName": "内置项目-二级护理", "dataSetFieldCode": "twoLevel", "dataSetFieldName": "二级护理人数", "updateUserId": "5bb2f84bde244a22841967f49ccd1e05", "updateUserName": "系统管理员", "updateTime": "2021-09-08 16:21:53", "deleteBit": false, "typeId": 6, "titleShowTotal": true, "usedFlag": null, "materialNo": null, "materialName": null, "typeName": "医嘱内置", "resultType": 1, "displayOrder": 0 }], [{ "val": "手写内容", "rowspan": 1, "colspan": 1, "key": "", "cellType": "text", "label": "", "otherVal": "", "otherSelect": false, "isRemove": false, "isEditCell": false, "size": "中", "isColorChange": false, "color": "rgba(20, 0, 0, 1)", "isWeight": false, "isItalic": false, "underline": false, "align": "中", "valign": "中", "cellFill": "rgba(254, 254, 254, 1)", "topBorderColor": "", "bottomBorderColor": "", "leftBorderColor": "", "rightBorderColor": "", "isShow": true, "selectFlag": "td-3-0-1-1" }, { "val": "", "rowspan": 1, "colspan": 1, "key": "", "cellType": "text", "label": "", "otherVal": "", "otherSelect": false, "isRemove": false, "isEditCell": false, "size": "中", "isColorChange": false, "color": "rgba(20, 0, 0, 1)", "isWeight": false, "isItalic": false, "underline": false, "align": "中", "valign": "中", "cellFill": "rgba(254, 254, 254, 1)", "topBorderColor": "", "bottomBorderColor": "", "leftBorderColor": "", "rightBorderColor": "", "isShow": true, "selectFlag": "td-3-1-1-1" }] ] }, "options": { "color": "rgba(166,208,242,1)", "headRowNum": 0, "bodyRowNum": 4, "colNum": 2, "rowMax": 50, "colMax": 50, "headerFill": "#F9FAFB", "cellFill": "rgba(255, 255, 255, 0)", "rowBorderColor": "rgba(37,58,101,1)", "colBorderColor": "rgba(37,58,101,1)", "heightAdaptive": false, "isSelect": true, "isPage": false, "isFirstCreat": false, "isRowTotal": false, "isColTotal": false, "borderSize": "1", "configMode": "internal", "changeKey": ["isFirstCreat"] } } ``` ##### 5.6.2 加载完成标识说明 表格加载完成标识(tableComplete):表格加载完成之后,才会开始监听表格配置变化,进而触发历史记录操作。由于本身的回显表格也会导致表格配置变化,所以增加该标识进行拦截。 数据加载完成标识(dataComplete):数据加载完成后会修改值,一般用于数据加载完成后的loading关闭。 ##### 5.6.3 setTable 初始化创建表格 根据表头行数、表体行数、表体列数创建初始表格,常用于编辑模式下,没有tableJosn配置的空白表格创建,会触发表格加载完成标识。 ##### 5.6.3 echoTable 表格回显 根据tableJson配置进行表格回显。常用于渲染模式下的表格回显。会设置数据未加载,表格加载完成。 ##### 5.6.4 refreshTable 刷新表格配置 根据tableJson配置进行表格回显。常用于编辑模式下的表格回显。 ##### 5.6.5 tableSetValue 加载表格数据 根据多数据数组、单数据map、是否隐藏无数据展示标记,加载表格数据。加载完成后触发dataComplete方法。 ##### 5.6.6 getTableJSON 获取表格JSON 获取调整后的表格json字符串 ##### 5.6.7 changeTableExtendOptions 修改表格扩展属性配置 由于表格扩展属性配置不属于通用表格的配置,属于定制化需求,所以表格扩展属性值并没有存入tableJson中,是单独进行保存的。但是扩展属性的修改也需要纳入历史记录操作的监测中,所以在组件内部储存了表格扩展属性对象,并且提供方法给外部调用,允许外部修改扩展属性值。 ### 6、表格组件-简易模式 建设中!!! ### 7、表格组件-动态列模式 建设中!!! ### 8、公共内容 #### 8.1 generalTableConstant 通用表格常量 TABLE_OPTIONS: 表格配置 CELL_OPTIONS:单元格配置 DEFAULT_CELL:默认单元格配置 #### 8.2 generalTableUtils 提供一些外部需要的方法 resetTableItemContent 清空表格项目内容: 复制医嘱任务表格时,需要清空数据项内容 setTableJsonExtendOptions 设置表格扩展属性:提供设置表格扩展属性的方法 ```javascript // 清空表格项目内容 export const resetTableItemContent = function(tableJson) { // 清空项目内容方法 const resetItemContent = (item) => { item['val'] = '' item['dataSetCode'] = '' item['dataSetName'] = '' item['key'] = '' item['label'] = '' item['resultType'] = '' item['tag'] = '' item['displayOrder'] = null return item } if (!tableJson) { return tableJson } // 获取表格配置对象 const tableJsonObj = JSON.parse(tableJson) // 获取数据对象 const data = tableJsonObj.data // 表格数据 const tdData = data.tdData || [] // 重置表格中的项目数据 tdData.forEach((row, rowIndex) => { row.forEach((item, colIndex) => { // 如果包含内容(由左侧项目拖拽生成的) if (item.dataSetCode) { // 重置项目内容 item = resetItemContent(item) // 赋值 tdData[rowIndex][colIndex] = item } }) }) // 表头数据 const thData = data.thData || [] thData.forEach((row, rowIndex) => { row.forEach((item, colIndex) => { // 如果包含内容(由左侧项目拖拽生成的) if (item.dataSetCode) { // 重置项目内容 item = resetItemContent(item) // 赋值 tdData[rowIndex][colIndex] = item } }) }) tableJsonObj.data.tdData = tdData tableJsonObj.data.thData = thData // 返回处理后的json return JSON.stringify(tableJsonObj) } /** * 设置tableJson的扩展属性值extendOptions (扩展属性值仅用作参数传递,不作存储以及回显) * @param tableJson * @param key * @param value * @returns {string|*} */ export const setTableJsonExtendOptions = (tableJson, key, value) => { if (!tableJson) { return tableJson } // 转换js对象 const tableJsonObj = JSON.parse(tableJson) // 获取表格扩展属性对象 const extendOptions = tableJsonObj.extendOptions || {} // 设置键值对 extendOptions[key] = value // 重设到js对象中 tableJsonObj.extendOptions = extendOptions // 重新转换json字符串 tableJson = JSON.stringify(tableJsonObj) return tableJson } ``` ## 五、使用案例 ### 1、简易示例-表格设计 ```vue