ag-grid动态加载表数据

  优势:灵活度高,代码复用性强

实现步骤:

1.  安装 ag-grid-vue 组件,

        在vue项目中,运行如下命令即可安装

        npm install --save ag-grid-community ag-grid-vue vue-property-decorator@^8.0.0

      安装完成后,在 package.json 文件中可以看到如下组件,说明已经安装成功

   ag-grid动态生成表头及绑定表数据_ide

     在后续运行项目过程中,如果提示要安装  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

   ag-grid动态生成表头及绑定表数据_json_02

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的高度,否则列表不会展示数据

  ag-grid动态生成表头及绑定表数据_ide_03

  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;width: 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 {
        width: 600px;
        height: 520px;
    }
    #myGrid {
        flex: 1 1 0px;
        width: 100%;
    }
    .buttonStyle {
        background: #559ed4;
        width: 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>