# g-table
**Repository Path**: ujjldn/g-table
## Basic Information
- **Project Name**: g-table
- **Description**: 基于 Vue 3 + Element Plus 的可配置化表格组件,支持远程/本地数据、搜索、分页、列设置、高级筛选等功能。多级表头支持(递归渲染)、数据表属性可视化编辑、数据列可视化编辑、可通过sql语句生成数据列(create table/insert into/update)。
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: 2.0
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2025-06-21
- **Last Updated**: 2026-01-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Vue, Element-UI
## README
---
# 📊 G-Table - 可配置化 Vue 表格组件
> 基于 Vue 3 + Element Plus 的可配置化表格组件,可视化配置表格属性和数据列,支持远程/本地数据、搜索、分页、列设置、高级筛选等功能。
---
## ✅ 功能亮点
- 🧱 支持远程和本地数据源
- 🔍 通用关键字搜索 + 高级字段筛选
- 📋 列设置(显示/隐藏列)
- 📈 分页 & 排序支持
- 📥 插槽支持:工具栏、操作列、自定义列渲染等
- 🔄 数据刷新与状态保持
- 📐 多级表头支持(递归渲染)
- 📝 数据表属性可视化编辑
- 📝 数据列可视化编辑
- 📝 可通过sql语句生成数据列(create table/insert into/update)
- 📝 数据列除插槽slot-${prop}外,可以直接简单格式化取字典数据 getDict or getOption
- 📝 合计行,summaryType可以选择默认的sum,count等内置的函数,或自定义函数summaryMethod
---
## 📦 技术栈
| 技术 | 版本 |
|------|------|
| Vue | ^3.2 |
| Element Plus | latest |
| Axios | latest |
---



## 📁 目录结构
```bash
src/
├── components/
│ └── g-table.vue # 表格组件
| └── g-table-multi-level-column.vue # 表格数据列渲染组件 (多级),未提取出来前仅支持两级表头,原文件在temp目录下
| └── column-setting-tree # 表格数据列树组件,用于列设置是否显示,原el-checkbox-group组件,不支持多级列设置
│ └── g-table-columns-editor.vue # 表格数据列可视化编辑组件
│ └── g-table-options-editor.vue # 表格属性和数据列可视化编辑组件,包括g-table-columns-editor.vue功能
│ └── import-excel-dialog.vue # excel导入预览组件
│ └── search-inputs.vue # 高级搜索组件 用于 g-table
│ └── search-select-options-input.vue # 搜索组件select 组件 选项输入框,用于g-table-columns-editor、g-table-options-editor
├── utils/
│ └── utils.js # 工具函数(SQL解析、生成测试数据等)
│ └── directive.js # 数据列可视化编辑组件拖拽排序库
│ └── export.js # 数据、列、配置项导出
│ └── import.js # 数据、列、配置项导入
├── test/
│ └── columns.html # 表格列编辑示例页面
│ └── test.html # 表格示例页面
│ └── options.html # 表格属性示例页面 包括三个组件 属性项列编辑,列编辑,预览
```
---
## 📦 安装使用
### 1. 安装依赖
```bash
npm install
```
### 2. 引入组件
```vue
编辑
删除
复制
添加
getSelect
```
---
## 📝 Props 说明
| 属性名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
|v-model:table-options|object|见示例|
|v-model:table-columns|Array|[]|数据列|
|v-model:table-data|Array|[]|数据源|
|dict-datas|Array|[]|字典数据|
|parent-id|string|''|子表父级ID字段名|
|--------|------|--------|------|
|treeSubLoad|function|()=>{}|树形结构子表数据加载,可直接load选项获取数据|
|update:selected|function|()=>{}|选中行数据更新,返回当前行数据|
|update:current|function|()=>{}|当前行数据更新,返回当前行数据|
|sort-change|function|()=>{}|排序改变|
|update:tableColumns|function|()=>{}|列数据更新,返回当前列数据|
|update:tableData|function|()=>{}|数据更新,返回当前数据|
|update:tableOptions|function|()=>{}|表格配置更新,返回当前表格配置|
|handleAdd|function|()=>{}|新增按钮点击事件|
|handleImport|function|()=>{}|导入框确认导入按钮点击事件|
---
## Slots
| 名称 | 作用 |
|------|------|
|action|操作行按钮|
|toolber|工具栏|
|slot-prop|自定义列,prop为列名,不区分大小写|
|slot-search-prop|自定义高级检索字段编辑框,prop为列名,v2.1.0 新增|
|subTable|子表|
|tableTitle|表格标题,主要用于打印标题|
|left-aside|左侧固定列 showLeftAside为true时生效|
|right-aside|右侧固定列 showRightAside为true时生效|
## 子表示例
```vue
新增
```
```
```
## ⚙️ API 文档
### g-table 表格选项
|选项名|类型|默认值|说明|
|------|------|------|------|
|dataApi|string|''|数据源 API 地址,例如:http://localhost:5173/public/mockData.json|
|rowKey|string|'name'|行唯一标识字段名,用于区分每一行数据|
|pagination|boolean|true|是否启用分页功能|
|showSummary|boolean|true|是否显示合计行|
|summaryColumns|array|['salary']|合计行字段名列表,指定需要计算的列|
|summaryMethod|function|null|合计行计算方法,接收一个参数,为当前行数据对象,返回一个对象,包含需要计算的字段名和值,当null时,则使用默认方法配合列的summaryType进行计算|
|selectionType|string|'multiple'|选择类型,可选值:'single'、'multiple'|
|selectedRowKeys|array|['用户1','用户3']|已选行的 rowKey 字段值数组|
|options.border|boolean|true|是否显示表格边框|
|options.stripe|boolean|true|是否显示斑马纹(交替行背景色)|
|options.pageSizes|array|undefined|每页显示数量选择器选项,如 [10,20,50,100,200]|
|treeProps.children|string|'children'|树形结构子级字段名|
|treeProps.checkStrictly|boolean|false|是否父子节点选择不关联|
|lazy|boolean|false|是否懒加载树形结构数据,v2.0.6 新增|
|load|function|undefined|懒加载树形结构数据时,获取子级数据的方法,可用@treeSubLoad,v2.0.6 新增|
|tableLayout|string|'fixed'|表格布局方式,如 'fixed'、'auto'|
|showDefaultAdd|boolean|false|是否显示默认新增按钮|
|showAdvancedSearch|boolean|true|是否显示高级搜索功能|
|showRefresh|boolean|true|是否显示刷新按钮|
|showColumns|boolean|true|是否显示列设置功能|
|showExport|boolean|true|是否显示导出 Excel 按钮|
|showImport|boolean|true|是否显示导入功能按钮|
|showToolbar|boolean|true|是否显示工具栏,false时表上左侧工具栏与右侧搜索栏将均不显示,v2.0.2 新增|
|showSearch|boolean|true|是否显示搜索框,v2.0.2 新增|
|hasSubTable|boolean|false|是否显示子表,子表需subTable插槽包新g-table,v2.0.2 新增|
|showPrint|boolean|false|是否显示打印按钮,v2.0.8 新增|
|showTitle|boolean|false|是否显示表格标题,v2.0.8 新增|
|title|string|'G-Table'|表格标题,v2.0.8 新增|
|showSelectionColumn|boolean|true|是否显示选择列,v2.0.8 新增|
|showExpandColumn|boolean|false|是否显示展开列,v2.0.8 新增|
|token|string|''|data-api使用post请求时,增加参数token,v2.1.2 新增|
|Authorization|string|''|data-api使用post请求时,请求头中Authorization的值,v2.1.2 新增|
|loadTableData|function|null|自定义加载表格数据,v2.1.2 新增|
|showLeftAside|boolean|false|是否显示左侧,v2.1.3 新增|
|leftAsideWidth|string or number |200|左侧宽度,v2.1.3 新增|
|showRightAside|boolean|false|是否显示右侧,v2.1.3 新增|
|rightAsideWidth|string or number |200|右侧宽度,v2.1.3 新增|
---
## 🔧 g-table column列选项
| 选项名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
|columnId|number|1|列唯一标识 ID,用于排序和数据列编辑|
|prop|string|'gender'|字段名,对应数据源中的键名|
|label|string|'性别'|列标题显示名称|
|width|number|undefined|列宽度,如 100px、100%、auto 等|
|sortable|boolean|false|是否允许排序|
|fixed|string|undefined|列是否固定,可选值:'left'、'right'|
|align|string|'center'|列对齐方式,可选值:'left'、'center'、'right'|
|headerAlign|string|'center'|列标题对齐方式,可选值:'left'、'center'、'right'|
|searchable|boolean|true|是否在高级搜索中显示编辑框|
|visible|boolean|true|是否显示该列|
|resizable|boolean|true|是否允许调整列宽|
|slotUsed|boolean|undefined|是否使用Slot-prop插槽自定义渲染列,优先formatterFn|
|formatterFn|string|undefined|自定义单元格内容渲染函数,用于简单格式化展示数据,如:return cellValue ? cellValue + '岁' : ''; v2.0.1增加调用字典功能:return getDict('gender', cellValue,'') or getDict({'1':'男','2':'女'}, cellValue,'') or getOption('options1',cellValue,'') or getOption( [{value: '1', label: '选项1'}, {value: '2', label: '选项2'}],cellValue,'') or getOption( column?fieldOptions?.options,cellValue,'') or 指定fieldOptions.useDict和dictCode时直接使用getDict(null, cellValue,'')|
|summaryType|string|'count'|合计行计算方式,summaryColumns内有字段名,且summaryMethod未自定义才有效,可选值:sum, avg, min, max, count, median, smax, smin|
|--------|------|--------|------|
|fieldOptions.onToolbar|boolean|false|是否在工具栏上显示编辑框|
|fieldOptions.width|string|'100%'|工具栏显示编辑框宽度|
|fieldOptions.type|string|'text'|搜索编辑框类型,如 text, number, date, select,daterange,datetimerange 等|
|fieldOptions.format|string|undefined|规定日期格式用|
|fieldOptions.useDict|boolean|false|fieldOptions.type=select才有效,是否使用字典|
|fieldOptions.dictCode|string|undefined|fieldOptions.type=select才有效,字典编码|
|fieldOptions.options|array|[{label: '男', value: '1'}, {label: '女', value: '2'}]|fieldOptions.type=select时,下拉选择框的选项列表|
|fieldOptions.props|object|undefined|自定义其他属性项, v2.1.0 新增|
---
### g-table 方法暴露(通过 `defineExpose`)
| 方法名 | 参数 | 说明 |备注|
|-------|------|------|-----|
|setTableColumns|columns:Array|设置表格列同|v-model:table-columns|
|setTableOptions|options:object|设置表格选项同|v-model:table-options|
|setTableData|data:Array|设置表格数据同|v-model:table-data|
|setSelectedRowKeys|keys:Array|设置表格选中keys|同tableOptions.selectedRowKeys|
|setSelectedkeys|keys:Array or string|同setSelectedRowKeys|-|
|addSelectedKeys|keys:Array or string|添加选中keys|加入到tableOptions.selectedRowKeys|v2.0.7增加|
|setSearchKeyword|keyword:String|设置表格搜索关键字,并执行handleGeneralSearch|v2.0.4 修改|
|setSearchField|key:string,value:any|设置表格搜索字段|v2.1.0 增加|
|setSearchFields|values:object|设置多个表格搜索字段|v2.0.4增加,v2.1.0 修改参数|
|getTableColumns|-|获取表格列同|v-model:table-columns|
|getTableOptions|-|获取表格选项同|v-model:table-options|
|getTableData|-|获取表格数据同|v-model:table-data|
|refreshTable|-|刷新表格列及数据|-|
|refreshTableData|-|刷新表格数据|v2.0.4 增加|
|resetTable|-|重置表格选项、列及数据为{} 或 []|v2.0.7 增加|
|handleGeneralSearch|-|执行表格搜索|v2.0.4 增加|
|handleSearch|-|执行表格搜索,同handleGeneralSearch|v2.0.4 增加|
|setSearchKeyword|keyword:String|设置搜索关键字,并刷新表格数据|-|
|setVisibleColumns|columns:Array|设置可见列|-|
|getSelectionRows|-|获取已选行|-|
|getSelectedRowKeys|-|获取已选行key|-|
|getSelectedKeys|-|获取已选行key|-|
|clearSelection|-|清除已选行|-|
|toggleAllSelection|-|切换全选|-|
|toggleRowSelection|row:Object,selected:Boolean|切换单行选中状态|-|
|toggleCheckStrictly|-|切换父子节点选中状态,父子节点都选中时,父节点会处于选中状态,否则处于未选中状态|-|
|isEmpty|data:any (proxy,array,object,string..)|判断是否为空|-|
|isProxy|data:any|判断是否为proxy|-|
|deepClone|data:any|深度克隆|-|
|proxyToRaw|data:any|proxy转raw 同vue toRaw|-|
|print|-|打开组件打印设置框|重组打印或window.print()|
```
```
### g-table-options-editor 方法暴露(通过 `defineExpose`)
| 方法名 | 参数 | 说明 |
|-------|------|------|
|setTableColumns|columns:Array|设置表格列同v-model:table-columns|
|setTableOptions|options:object|设置表格选项同v-model:table-options|
|setTableData|data:Array|设置表格数据同v-model:table-data|
|getTableColumns|-|获取表格列同v-model:table-columns|
|getTableOptions|-|获取表格选项同v-model:table-options|
|getTableData|-|获取表格数据同v-model:table-data|
|getSummaryColumns|-|获取合计行字段列|
```
```
### g-table-columns-editor 方法暴露(通过 `defineExpose`)
| 方法名 | 参数 | 说明 |
|-------|------|------|
|setTableColumns|columns:Array|设置表格列同v-model:table-columns|
|setTableData|data:Array|设置表格数据同v-model:table-data|
|getTableColumns|-|获取表格列同v-model:table-columns|
|getTableData|-|获取表格数据同v-model:table-data|
|getSummaryColumns|-|获取合计行字段列|
```
```
## 🛠 开发者指南
### 本地运行
```bash
npm run dev
```
### 构建发布
```bash
npm run build
```
## cdn 引入示例 详见 test/gtable.html
```html
g-table 测试实例
```
## 更新日志
### 2025-07-01
1. 修改列设置使用el-tree组件,并独立封闭,改进多级列选择是否显示
2. 添加列编辑组件中数据渲染可选slot或简单格式化,简单格式化可调用高级检索设置的字段设置的内容
```js
const option = column?.fieldOptions?.options.find(opt=>opt.value === cellValue);
return option ? option.label : cellValue;
// v2.0.1 new add getOption
return getOption(column?.fieldOptions?.options, cellValue,'默认值');
or
return getDict('gender',cellValue,'默认值') // 必须配置字典 :dict-datas="{'gender':{'1':'男','2':'女'}}"
or
return getDict({'1':'男','2':'女'},cellValue,'默认值')
```
### 2025-07-02
1. 修正数据列slotUsed为true时,渲染slot内容不正确问题
2. 数据列增加配置项summaryType,默认合计行可选择 ['sum', 'avg', 'min', 'max', 'count', 'median','smax','smin'], 数字:合计sum、平均值avg、中位数median、最大值max、最小值min,文本:最大值smax、最小值smin,其他:计数count
3. 添加数据项编辑器合计行字段编辑框增加按钮自动从columns中获取需要合计的字段列表
4. 正式确认版本号: v2.0.0
### 2025-07-03 v2.0.1
1. 数据列编辑器增加生成测试数据功能,记录数可通过参数设置 testDataCount,默认为15
2. 数据列简单格式化中增加字典调用功能 增加getDict和getOption函数
```js
return getDict(dictCode, key, defaultValue); //optionsCode:string时调用props.dictDatas数据,object时直接调用optionsCode
return getOption(optionsCode, value, defaultLabel); // optionsCode:string时调用props.dictDatas数据,[object, object, object]时直接调用optionsCode数据
```
```json
const dictDatas={
"dictCode1": {"1": "选项1", "2": "选项2"}, // return getDict('dictCode1', '1', ''); --> 选项1
"gender": {"1": "男", "2": "女"}, // return getDict('gender', '3', '男'); --> 男
"options1" : [{value: '1', label: '选项1'}, {value: '2', label: '选项2'}], // return getOption('options1', '1','选项3') --> 选项1
}
```
### 2025-07-04 v2.0.2
1. 增加showToolbar、showSearch、hasSubTable 属性
2. 增加子表功能,需要配置hasSubTable=true,并使用subTable插槽加g-table等组件,如果使用g-table组件,toolbar/action/slot-${prop}/插槽有效,但主表给出选择的数据时,不会直接取子表数据,需取子表数据:1) 需使用tree表,及主表数据加children字段; 2) [调用主表数据时,存储子表ref,再按g-table组件调用子表数据]](README.md#L307)。
### 2025-07-04 v2.0.3
1. 增加子表取数据实例,见App.vue
### 2025-07-11 v2.0.4
1. g-table增加暴露方法setSearchFields,用于插槽toolbar里自定增加dataApi查询内容
2. g-table增加暴露方法refreshTableData,仅更新表格数据,refreshTable更新表格列及数据
3. 增加高级检索设置-字段设置select\multiSelect字段选项:是否使用字典useDict,字典编码dictCode,来调用字典数据形成下单列表,同时getDict和getOption方法集成
```js
// formatterFn中添加字典数据转换方法,
// 第一个参数不等于true时(null,false,...)根据useDict和dictCode值获取字典数据
// 如:
return getDict(false, cellValue,'defaultValue');
return getOption(false, cellValue,'defaultValue');
```
### 2025-07-12 v2.0.5
1. 检索字段post后台时,单独放在params.searchFields中,方便后台处理
2. 高检检索字段增加置工具栏onToolbar\工具栏上宽度width属性,用于区分是否放置工具栏或高级检索面板
3. 修复g-table-options-editor 组件变更属性预览不即时显示问题
4. 修复g-table-columns-editor 组件生成测试时因fieldOptions.type 为undefined 导致报错
---
### 2025-07-21 v2.0.6
1. 修复fixed不起作用问题,增加min-width属性及el-table-column v-if修改为v-show
2. 增加原生树形lazy和load / treeSubLoad, treeSubLoad优先于load
```vue
// 加载树形子数据
// 方式一
const handleTreeSubLoadInParent = (row, treeNode, resolve) => {
// 示例:异步加载子节点
axios.get(`/api/children?parentId=${row.id}`).then(res => {
resolve(res.data)
})
}
方式二
const tableOptions = {
lazy: true,
rowKey: 'id',
load: (row, treeNode, resolve) => {
axios.get(`/api/children?parentId=${row.id}`).then(res => {
resolve(res.data)
})
}
}
```
### 2025-07-23 v2.0.7
1. g-table-columns-editor修改默认生成的测试数据条数为5
2. g-table-options-editor载入默认设置,预览修改为tab-change事件中通过g-table组件setTableOptions等方法载入
3. g-table载入默认设置
4. g-table增加resetTable方法,清空表格table-options,table-columns,table-data
### 2025-08-01 v2.0.7
1. g-table formatterFn中使用getDict和getOption方法,当参数1dictCode非true时,按A.fieldOptions.useDict和fieldOptions.dictCode值获取字典数据,B.fieldOptions.options数据 顺序取值。
2. 修改vite.config.gtable-all.js 配置项,解决不能在gbk环境中使用问题。
3. g-table 增加addSelectedKeys方法,用于在原选中数据基础上添加新的数据。
### 2025-08-04 v2.0.8
1. 增加打印功能 print(),直接使用 window.print()
2. 增加是否显示选择列、展开列、标题等参数,标题可以使用插槽tableTile自定义标题
3. 增加handleImport方法,用于导入数据框选择数据后确认导入处理
### 2025-08-06 v2.1.0
1. g-table优化高级检索表单,使用fieldOptions动态生成表单,并支持slot-search-${prop} 插槽
2. g-table增加fieldOptions.props,选填,对高级检索表单字段进行增强配置
3. g-table-columns-editor增加fieldOptions.props属性,对字段进行增强配置
4. g-table-columns-editor增加,增加按钮,用于添加字段
5. g-table-columns-editor增加,增加操作列
6. g-table-columns-editor修正未设置检索字段类型不生成测试数据问题
### 2025-08-07 v2.1.0
1. g-table增加暴露方法setSearchField,用于设置高级检索表单数据
2. g-table修改原setSearchFields的参数为object,一次设置多个字段
### 2025-08-14 v2.1.1
1. g-table增加 printSimple方法,用于打印去除样式表后简单表格,见utils/print.js
2. g-table打印对话框增加内容行排版方式选择,默认center
### 2025-09-14 v2.1.2
1. g-table增加 token字段,用于设置token
2. g-table增加 Authorization字段,用于设置请求头的Authorization字段
3. g-table增加 load-table-data属性,用于自定义加载数据,功能类似table-data
### 2025-09-16 v2.1.3
1. 增加左右侧布局功能 showLeftAside、showRightAside、leftAsideWidth、rightAsideWidth 属性,用于显示左右侧布局
2. 优化左右侧布局分隔面板
### 2025-11-17 v2.1.3
1. 全部el-select使用clearable属性,解决在webview中下el-select下拉框无限高问题
### 2025-11-18 v2.1.3
1. 修复showTitle和showToolbar属性,toolbar被覆盖问题
### 2025-11-19 v2.1.4
1. 修复字段名称大写时slot-${prop} 插槽无效问题,修改为不区分大小写
2. 优化g-table-columns-editor拖拽排序功能,字段时允许非同级拖拽,实现下级到上级,上级到下级,同级拖拽
### 2025-11-21 v2.1.5
1. 增加高级搜索框 daterange 和 datetimerange 两种编辑框
2. 优化slot-search-${prop} 插槽,父组件使用:model-value和@input 直接更新gtable组件查询参数
```html
```
### 2026-1-27 v2.1.6
1. 优化g-table.vue,左中右el-aside顶部对齐(缩小表格与工具栏间距)
---
## 🎉 未来计划
1. 优化代码逻辑
2. 同步升级pinia 版本
3. 国际化支持(i18n)
---
## 🎉 常见问题
| 问题 | 解决方案 |
| --- | --- |
|表格无法选择|检查rowKey是否正确|
|合计行未生效|检查summaryType或summaryMethod|
|使用refreshTable更新表数据较慢|refreshTable功能是重新配置表格、列数据及刷新数据,如果只是刷新数据,请使用refreshTableData|
|重组打印时多行表格只显示一行|检查打印框内【显示表格展开列】是否关闭|
|data-api方式取数据时不能使用get方式|请使用post方式,主要是方便后台取检索数据参数searchFields|
---
## 📎 贡献指南
欢迎贡献代码,请遵循以下步骤:
1. Fork 项目
2. 创建 feature 分支
3. 提交 PR 并描述修改内容
4. 等待 Review 合并
---
## 📬 联系我们
如有问题或建议,请提交 Issues 或联系维护者。
---