ag-grid动态加载表数据
优势:灵活度高,代码复用性强
实现步骤:
1. 安装 ag-grid-vue 组件,
在vue项目中,运行如下命令即可安装
npm install --save ag-grid-community ag-grid-vue vue-property-decorator@^8.0.0
安装完成后,在 package.json 文件中可以看到如下组件,说明已经安装成功
在后续运行项目过程中,如果提示要安装 enterprise 组件,根据控制台提示的命令安装即可。
npm install --save ag-grid-enterprise
2. 在vue页面中引入组件
import "ag-grid-community/dist/styles/ag-grid.css"; import "ag-grid-community/dist/styles/ag-theme-balham.css" import {AgGridVue} from "ag-grid-vue" import "ag-grid-enterprise" //关键依赖:引入之后组件才会生效
其中:ag-grid-enterprise 是非常关键的依赖,一定要导入,aggrid组件才会生效。
3. 在 components 方法中注册 AgGridVue
4. 搭建aggrid框架
<!--右侧内容栏(动态表格)--> <div class="commendContent" id="ag-gridStyle"> <ag-grid-vue class="table ag-theme-balham" v-show="isSee" id="myGrid" :columnDefs="columnDefs" :rowData="rowData" :sideBar="sideBar" :enableColResize="true" row-selection="multiple" @selection-changed="onSelectionChanged" @gridReady="onGridReady" :tooltipShowDelay="tooltipShowDelay" :localeText="localeText" :height="tableMaxHeight" > </ag-grid-vue> </div>
框架搭建完成之后,一定要指定table的高度,否则列表不会展示数据
5. 定义aggrid相关变量及完成汉化
//ag-grid相关 domLayout:null, //高度自适应,根据获取到的数据条数自适应高 度,加载速度慢,页面卡顿,不推荐使用 tooltipShowDelay: [], //鼠标悬浮在单元格上,显示全名 gridOptions: {}, gridApi: {}, columnApi: [], //定义ag-grid列 columnDefs: [], //ag-grid需要显示的数据 rowData: [], //ag-grid列表右侧的过滤器 sideBar: [], //存放多选框选中的数据 selectRows: [], // 当输入sql错误和结果集为0的时候不显示aggrid表格 isSee: true, globalDropDownBox: false, //移入显示下拉框 globalDropTop: 0, globalDropLeft: 0, timeOut: setTimeout, modelDetailRelation: [], // 存放模型详细关联表 countData:'', selectedData:0, //ag-grid汉化 localeText:{ // for filter panel page: '页', more: '更多', to: '到', /* of: 'daOf', */ next: '下一页', last: '最后', first: '第一', previous: '以前的', loadingOoo: '加载中...', // Row:"行", // 'Row Groups':"行分组", // for set filter selectAll: '全部选择', searchOoo: '搜索...', blanks: '空', Column:"列", labels:"标签", // for number filter and text filter filterOoo: '过滤', applyFilter: '过滤中...', equals: '等于', notEqual: '不等于', // for number filter lessThan: '少于', greaterThan: '多于', lessThanOrEqual: '小于等于', greaterThanOrEqual: '大于等于', inRange: '在范围内', // for text filter contains: '包含', notContains: '不包含', startsWith: '开始', endsWith: '结束', // filter conditions andCondition: '并且', orCondition: '或者', // the header of the default group column // group: '分组', // tool panel columns: '列', filters: '过滤器', rowGroupColumns: '行列组', // rowGroupColumnsEmptyMessage: '行列组为空', valueColumns: '列值', pivotMode: '透视模式', // groups: '分组', values: '值', // pivots: '中心点', valueColumnsEmptyMessage: '列值为空', // pivotColumnsEmptyMessage: '中心点为空', toolPanelButton: '工具按钮', // other noRowsToShow: '暂时没有要展示的数据', // enterprise menu pinColumn: '列位置调整', valueAggregation: '聚合值', autosizeThiscolumn: '自动调整此列大小', autosizeAllColumns: '自动调整所有列的大小', groupBy: '分组', ungroupBy: '取消分组', resetColumns: '重置列', expandAll: '展开所有', collapseAll: '关闭所有', toolPanel: '工具', export: '导出', csvExport: 'CSV 导出', excelExport: 'Excel 导出(.xlsx)', excelXmlExport: 'Excel 导出(.xml)', // enterprise menu pinning PinColumn:"固定", pinLeft: '居左', pinRight: '居右', noPin: '默认', // enterprise menu aggregation and status bar sum: '合计', min: '最小值', max: '最大值', /* none: 'laNone', */ count: '计数', average: '平均值', avg : '平均值', // standard menu copy: '复制', copyWithHeaders: '携表头复制', ctrlC: 'ctrl-C', paste: '粘贴', ctrlV: 'ctrl-V' },
6. 开启列表右侧的工具面板
this.gridOptions = {} this.sideBar = true; //开启右侧面板的关键代码 this.domLayout = 'autoHeight'; //高度自适应
7. aggrid创建完后之后要执行的事件
onGridReady(params) { // 获取gridApi this.gridApi = params.api; this.columnApi = params.columnApi; // 这时就可以通过gridApi调用ag-grid的传统方法了 this.gridApi.sizeColumnsToFit(); //默认隐藏右侧栏 this.gridApi.closeToolPanel(); this.gridApi.getDisplayedRowCount(); }
完整的aggrid动态加载实例:
<template> <div> <el-card class="box-card" style="margin-left: 14px; 100%;float: right;"> <div> <el-button class="buttonStyle" type="primary" plain @click="submitForm()" > 提交审核 </el-button> <ag-grid-vue class="table ag-theme-balham" v-show="isSee" id="myGrid" :columnDefs="columnDefs" :rowData="rowData" :sideBar="sideBar" :enableColResize="true" row-selection="multiple" :localeText="localeText" > </ag-grid-vue> </div> <!--分页组件--> <div class="block" style="float: right;margin-right: 15px;margin-top: 10px;"> <el-pagination @size-change="handleSizeChange($event)" @current-change="handleCurrentChange($event)" :current-page="page.current" :page-sizes="[10, 15, 20]" :page-size="page.size" layout="total, sizes, prev, pager, next, jumper" :total="this.page.total"> </el-pagination> </div> </el-card> </div> </template> <script> import "ag-grid-community/dist/styles/ag-grid.css"; import "ag-grid-community/dist/styles/ag-theme-balham.css"; import { AgGridVue } from "ag-grid-vue" import "ag-grid-enterprise" //关键依赖:引入之后组件才会生效 import {loadContentData} from "@/api/warning/warningdata"; export default { name: "show", components:{ AgGridVue, }, data (){ return{ gridOptions: {}, gridApi: {}, columnApi: [], //定义ag-grid列 columnDefs: [], //ag-grid需要显示的数据 rowData: [], //ag-grid列表右侧的过滤器 sideBar: [], //存放多选框选中的数据 selectRows: [], // 当输入sql错误和结果集为0的时候不显示aggrid表格 isSee: true, //ag-grid汉化 localeText:{ // for filter panel page: '页', more: '更多', to: '到', /* of: 'daOf', */ next: '下一页', last: '最后', first: '第一', previous: '以前的', loadingOoo: '加载中...', // Row:"行", // 'Row Groups':"行分组", // for set filter selectAll: '全部选择', searchOoo: '搜索...', blanks: '空', Column:"列", labels:"标签", // for number filter and text filter filterOoo: '过滤', applyFilter: '过滤中...', equals: '等于', notEqual: '不等于', // for number filter lessThan: '少于', greaterThan: '多于', lessThanOrEqual: '小于等于', greaterThanOrEqual: '大于等于', inRange: '在范围内', // for text filter contains: '包含', notContains: '不包含', startsWith: '开始', endsWith: '结束', // filter conditions andCondition: '并且', orCondition: '或者', // the header of the default group column // group: '分组', // tool panel columns: '列', filters: '过滤器', rowGroupColumns: '行列组', // rowGroupColumnsEmptyMessage: '行列组为空', valueColumns: '列值', pivotMode: '透视模式', // groups: '分组', values: '值', // pivots: '中心点', valueColumnsEmptyMessage: '列值为空', // pivotColumnsEmptyMessage: '中心点为空', toolPanelButton: '工具按钮', // other noRowsToShow: '没有可以展示的数据', // enterprise menu pinColumn: '列位置调整', valueAggregation: '聚合值', autosizeThiscolumn: '自动调整此列大小', autosizeAllColumns: '自动调整所有列的大小', groupBy: '分组', ungroupBy: '取消分组', resetColumns: '重置列', expandAll: '展开所有', collapseAll: '关闭所有', toolPanel: '工具', export: '导出', csvExport: 'CSV 导出', excelExport: 'Excel 导出(.xlsx)', excelXmlExport: 'Excel 导出(.xml)', // enterprise menu pinning PinColumn:"固定", pinLeft: '居左', pinRight: '居右', noPin: '默认', // enterprise menu aggregation and status bar sum: '合计', min: '最小值', max: '最大值', /* none: 'laNone', */ count: '计数', average: '平均值', avg : '平均值', // standard menu copy: '复制', copyWithHeaders: '携表头复制', ctrlC: 'ctrl-C', paste: '粘贴', ctrlV: 'ctrl-V' }, //分页相关(参数) page: {current: 1, size: 10, total: 0, records: []}, pageQueryTree: { condition: {}, pageNo: 1, pageSize:10, sortBy: 'asc', sortName: 'create_time', modelParamName: '', }, beforeTableName: '' }; }, methods:{ //获取预警表数据,将返回的数据放在ag-grid-vue 组件上 getData(tableName){ this.pageQueryTree.condition.单位名称 = tableName; this.pageQueryTree.condition.统一社会信用代码 = ''; loadContentData(this.pageQueryTree).then(resp =>{ var jsonStr = JSON.stringify(resp.data); var items = resp.data.columnData this.columnDefs = [] //表头 for(let i in items){ //过滤掉pk主键 if ("PK主键" !== items[i].columnName){ if (1 == i){ var obj ={ headerName: items[i].columnName, field: items[i].columnName, filter: true, //flex: 1, 该字段会影响列的宽度 editable: true, checkboxSelection: true }; this.columnDefs.push(obj); }else { var obj ={ headerName: items[i].columnName, field: items[i].columnName, filter: true, //flex: 1, 该字段会影响列的宽度 editable: true, }; this.columnDefs.push(obj); } } }; //获取表数据 this.rowData = [] for (var i = 0; i < resp.data.specifyData.records.length;i++){ //alert("返回数据的长度是:"+resp.data.specifyData.records.length) var items = resp.data.specifyData.records[i]; if (items.状态 === 0) { items.状态 = '待挂号' } else if (items.状态 === 1) { items.状态 = '挂号中' } else if (items.状态 === 2) { items.状态 = '预警待查' } else { // 3 items.状态 = '已销号' } this.rowData.push(items); } //分页的总条数 this.page.total = resp.data.specifyData.total; }) this.gridOptions = {} this.sideBar = true; //这是ag-grid列表右侧的筛选器,不能删除 }, //获取所选节点的列表 submitForm(){ } }, mounted() { this.gridApi = this.gridOptions.api; this.columnApi = this.gridOptions.columnApi; } } </script> <style scoped> .table { 600px; height: 520px; } #myGrid { flex: 1 1 0px; 100%; } .buttonStyle { background: #559ed4; 70px; height: 24px; padding: 4px; border-radius: 4px; position: relative; color: #ffffff; font-style: normal; font-family: "iconfont" !important; font-weight: normal !important; margin-right: 6px; margin-left: 970px; margin-bottom: 2px; } </style>