ag-grid在Vue项目中的基本使用

ag-grid官网

1、安装

npm install ag-grid-community ag-grid-vue --save-dev

2、在main.js中引入ag-grid的样式文件

// 引入ag-grid的样式文件
import '../node_modules/ag-grid-community/dist/styles/ag-grid.css';
import '../node_modules/ag-grid-community/dist/styles/ag-theme-balham.css';

3、在Vue组建中的基本使用

<template>
  <div>
    <!-- columnDefs表头  rowData表格数据-->
    <!-- ag-theme-balham 是ag-grid自带的表格样式类 -->
    <ag-grid-vue class="table ag-theme-balham" :columnDefs="columnDefs" :rowData="rowData"></ag-grid-vue>
  </div>
</template>

<script>
// 引入ag-grid-vue
import { AgGridVue } from 'ag-grid-vue';

export default {
  components: { AgGridVue },
  data () {
    return {
      columnDefs: [
        {headerName: '姓名', field: 'name'},
        {headerName: '性别', field: 'gender'},
        {headerName: '年龄', field: 'age'}
      ],
      rowData: [
        {name: '李煜', gender: '男', age: 20},
        {name: '柳叶', gender: '女', age: 25},
        {name: '姜宇', gender: '男', age: 18}
      ]
    };
  }
};
</script>

<style scoped>
.table{
  width: 600px;
  height: 200px;
}
</style>

4、设置表格列宽可以随意拖动改变

<template>
  <div>
    <!-- 设置 :enableColResize="true" 就可实现表格列宽随意拖动改变 -->
    <ag-grid-vue class="table ag-theme-balham" :columnDefs="columnDefs" :rowData="rowData" :enableColResize="true"></ag-grid-vue>
  </div>
</template>

<script>
// 引入ag-grid-vue
import { AgGridVue } from 'ag-grid-vue';
export default {
  components: { AgGridVue },
  data () {
    return {
      columnDefs: [
        {headerName: '姓名', field: 'name'},
        {headerName: '性别', field: 'gender'},
        {headerName: '年龄', field: 'age'}
      ],
      rowData: [
        {name: '李煜', gender: '男', age: 20},
        {name: '柳叶', gender: '女', age: 25},
        {name: '姜宇', gender: '男', age: 18}
      ]
    };
  }
};
</script>

<style scoped>
.table{
  width: 600px;
  height: 200px;
}
</style>

拖动后:

5、实现排序

<template>
  <div>
    <!-- 设置 enableSorting 为 true 就可实现表格数据排序-->
    <!-- 排序有默认顺序、升序、降序-->
    <ag-grid-vue class="table ag-theme-balham" :columnDefs="columnDefs" :rowData="rowData" :enableSorting="true"></ag-grid-vue>
  </div>
</template>

<script>
// 引入ag-grid-vue
import { AgGridVue } from 'ag-grid-vue';

export default {
  components: { AgGridVue },
  data () {
    return {
      columnDefs: [
        {headerName: '姓名', field: 'name'},
        {headerName: '性别', field: 'gender'},
        {headerName: '年龄', field: 'age'}
      ],
      rowData: [
        {name: '李煜', gender: '男', age: 20},
        {name: '柳叶', gender: '女', age: 25},
        {name: '姜宇', gender: '男', age: 18}
      ]
    };
  }
};
</script>

<style scoped>
.table{
  width: 600px;
  height: 200px;
}
</style>

可以任意一列排序

6、实现筛选

<template>
  <div>
    <!-- 设置 enableFilter 为 true 就可实现筛选功能-->
    <ag-grid-vue class="table ag-theme-balham" :columnDefs="columnDefs" :rowData="rowData" :enableFilter="true"></ag-grid-vue>
  </div>
</template>

<script>
// 引入ag-grid-vue
import { AgGridVue } from 'ag-grid-vue';

export default {
  components: { AgGridVue },
  data () {
    return {
      columnDefs: [
        {headerName: '姓名', field: 'name'},
        {headerName: '性别', field: 'gender'},
        {headerName: '年龄', field: 'age'}
      ],
      rowData: [
        {name: '李煜', gender: '男', age: 20},
        {name: '柳叶', gender: '女', age: 25},
        {name: '姜宇', gender: '男', age: 18}
      ]
    };
  }
};
</script>

<style scoped>
.table{
  width: 600px;
  height: 200px;
}
</style>

7、调整表格列宽大小自适应,避免横向滚动条

上面几个表格都有横向滚动条,

调用 Grid API 的 sizeColumnsToFit() 方法,就可以实现表格列宽大小自适应,避免横向滚动条

<template>
  <div>
    <!-- gridReady 绑定一个事件,在表格创建完成后执行 -->
    <ag-grid-vue class="table ag-theme-balham" :columnDefs="columnDefs" :rowData="rowData" :enableSorting="true" :enableFilter="true" :gridReady="onGridReady"></ag-grid-vue>
  </div>
</template>

<script>
// 引入ag-grid-vue
import { AgGridVue } from 'ag-grid-vue';

export default {
  components: { AgGridVue },
  data () {
    return {
      gridApi: null,
      columnApi: null,
      columnDefs: [
        {headerName: '姓名', field: 'name'},
        {headerName: '性别', field: 'gender'},
        {headerName: '年龄', field: 'age'}
      ],
      rowData: [
        {name: '李煜', gender: '男', age: 20},
        {name: '柳叶', gender: '女', age: 25},
        {name: '姜宇', gender: '男', age: 18}
      ]
    };
  },
  methods: {
    // 表格创建完成后执行
    onGridReady (params) {
      console.log(params);
      // 获取gridApi
      this.gridApi = params.api;
      this.columnApi = params.columnApi;
      // 调整表格列宽大小自适应
      this.gridApi.sizeColumnsToFit();
    }
  }
};
</script>

<style scoped>
.table{
  width: 600px;
  height: 200px;
}
</style>

8、实现单选

js中在绑定的表头 columnDefs 中增加 checkboxSelection: true 就会出现选择框,这个时候只能单选

<template>
  <div>
    <ag-grid-vue class="table ag-theme-balham" :columnDefs="columnDefs" :rowData="rowData"></ag-grid-vue>
  </div>
</template>

<script>
// 引入ag-grid-vue
import { AgGridVue } from 'ag-grid-vue';

export default {
  components: { AgGridVue },
  data () {
    return {
      columnDefs: [
        {headerName: '姓名', field: 'name', checkboxSelection: true},
        {headerName: '性别', field: 'gender'},
        {headerName: '年龄', field: 'age'}
      ],
      rowData: [
        {name: '李煜', gender: '男', age: 20},
        {name: '柳叶', gender: '女', age: 25},
        {name: '姜宇', gender: '男', age: 18}
      ]
    };
  }
};
</script>

<style scoped>
.table{
  width: 600px;
  height: 200px;
}
</style>

9、实现多选

js中在绑定的表头 columnDefs 中增加 checkboxSelection: true 就会出现选择框,这个时候只能单选

然后在HTML中设置 rowSelection="multiple" 就可以实现多选了

<template>
  <div>
    <!-- 设置 rowSelection="multiple" 实现多选 -->
    <ag-grid-vue class="table ag-theme-balham" :columnDefs="columnDefs" :rowData="rowData" rowSelection="multiple"></ag-grid-vue>
  </div>
</template>

<script>
// 引入ag-grid-vue
import { AgGridVue } from 'ag-grid-vue';

export default {
  components: { AgGridVue },
  data () {
    return {
      columnDefs: [
        {headerName: '姓名', field: 'name', checkboxSelection: true},
        {headerName: '性别', field: 'gender'},
        {headerName: '年龄', field: 'age'}
      ],
      rowData: [
        {name: '李煜', gender: '男', age: 20},
        {name: '柳叶', gender: '女', age: 25},
        {name: '姜宇', gender: '男', age: 18}
      ]
    };
  }
};
</script>

<style scoped>
.table{
  width: 600px;
  height: 200px;
}
</style>

10、获取选取的数据

调用 Grid API 的 getSelectedNodes() 方法,返回所选节点的列表

<template>
  <div>
    <button @click="getSelectedRows()">获取选择的数据</button>
    <!-- 设置 rowSelection="multiple" 实现多选 -->
    <ag-grid-vue class="table ag-theme-balham" :columnDefs="columnDefs" :rowData="rowData" rowSelection="multiple" :gridReady="onGridReady"></ag-grid-vue>
  </div>
</template>

<script>
// 引入ag-grid-vue
import { AgGridVue } from 'ag-grid-vue';

export default {
  components: { AgGridVue },
  data () {
    return {
      gridApi: null,
      columnApi: null,
      columnDefs: [
        {headerName: '姓名', field: 'name', checkboxSelection: true},
        {headerName: '性别', field: 'gender'},
        {headerName: '年龄', field: 'age'}
      ],
      rowData: [
        {name: '李煜', gender: '男', age: 20},
        {name: '柳叶', gender: '女', age: 25},
        {name: '姜宇', gender: '男', age: 18}
      ]
    };
  },
  methods: {
    // 表格创建完成后执行
    onGridReady (params) {
      console.log(params);
      // 获取gridApi
      this.gridApi = params.api;
      this.columnApi = params.columnApi;
      // 调整表格列宽大小自适应
      this.gridApi.sizeColumnsToFit();
    },
    getSelectedRows () {
      // 获取所选节点的列表
      const selectedNodes = this.gridApi.getSelectedNodes();
      console.log(selectedNodes);
      // 获取所选节点的列表数据
      var selectedData = selectedNodes.map(node => node.data);
      console.log(selectedData);
      // 获取所选节点的列表数据中的某一列数据
      var selectedDataName = selectedData.map(node => node.name);
      console.log(selectedDataName);
      // 拼接成字符串
      var selectedDataStringName = selectedDataName.join(', ');
      console.log(selectedDataStringName);
    }
  }
};
</script>

<style scoped>
.table{
  width: 600px;
  height: 200px;
  margin-top: 20px;
}
</style>

11、给 columnDefs 的元素 设置 children,渲染分组表头。

<template>
  <div>
    <!-- gridReady 绑定一个事件,在表格创建完成后执行 -->
    <ag-grid-vue class="table ag-theme-balham" :columnDefs="columnDefs" :rowData="rowData" :gridReady="onGridReady"></ag-grid-vue>
  </div>
</template>

<script>
// 引入ag-grid-vue
import { AgGridVue } from 'ag-grid-vue';
export default {
  components: { AgGridVue },
  data () {
    return {
      gridApi: null,
      columnApi: null,
      // 给 columnDefs 的元素 设置 children,可以渲染出分组表头。
      columnDefs: [
        {
          headerName: '基本信息',
          children: [
            {headerName: '姓名', field: 'name'},
            {headerName: '性别', field: 'gender'},
            {headerName: '年龄', field: 'age'}
          ]
        },
        {
          headerName: '收入',
          children: [
            {headerName: '月收入', field: 'income'},
            {headerName: '年收入', field: 'yearIncome'}
          ]
        }
      ],
      rowData: [
        {name: '李煜', gender: '男', age: 20, income: 2000, yearIncome: 24000},
        {name: '柳叶', gender: '女', age: 25, income: 2500, yearIncome: 35000},
        {name: '姜宇', gender: '男', age: 18, income: 1800, yearIncome: 20000}
      ]
    };
  },
  methods: {
    // 表格创建完成后执行
    onGridReady (params) {
      console.log(params);
      // 获取gridApi
      this.gridApi = params.api;
      this.columnApi = params.columnApi;
      // 调整表格列宽大小自适应
      this.gridApi.sizeColumnsToFit();
    }
  }
};
</script>

<style scoped>
.table{
  width: 60%;
  height: 200px;
}
</style>

12、设置表格固定列宽:width

<template>
  <div>
    <ag-grid-vue class="table ag-theme-balham" :columnDefs="columnDefs" :rowData="rowData"></ag-grid-vue>
  </div>
</template>

<script>
// 引入ag-grid-vue
import { AgGridVue } from 'ag-grid-vue';
export default {
  components: { AgGridVue },
  data () {
    return {
      columnDefs: [
        {headerName: 'ID', field: 'id', width: 60},
        {headerName: '姓名', field: 'name', width: 100},
        {headerName: '性别', field: 'gender', width: 100},
        {headerName: '年龄', field: 'age', width: 100}
      ],
      rowData: [
        {name: '李煜', gender: '男', age: 20, id: 1},
        {name: '柳叶', gender: '女', age: 25, id: 2},
        {name: '姜宇', gender: '男', age: 18, id: 3}
      ]
    };
  }
};
</script>

<style scoped>
.table{
  width: 600px;
  height: 200px;
}
</style>

13、设置表格最小最大列宽minWidth,maxWidth

<template>
  <div>
    <ag-grid-vue class="table ag-theme-balham" :columnDefs="columnDefs" :rowData="rowData" :gridReady="onGridReady"></ag-grid-vue>
  </div>
</template>

<script>
// 引入ag-grid-vue
import { AgGridVue } from 'ag-grid-vue';
export default {
  components: { AgGridVue },
  data () {
    return {
      columnDefs: [
        {headerName: 'ID', field: 'id', maxWidth: 60},
        {headerName: '姓名', field: 'name', minWidth: 240},
        {headerName: '性别', field: 'gender', minWidth: 180},
        {headerName: '年龄', field: 'age'}
      ],
      rowData: [
        {name: '李煜', gender: '男', age: 20, id: 1},
        {name: '柳叶', gender: '女', age: 25, id: 2},
        {name: '姜宇', gender: '男', age: 18, id: 3}
      ]
    };
  },
  methods: {
    // 表格创建完成后执行
    onGridReady (params) {
      console.log(params);
      // 获取gridApi
      this.gridApi = params.api;
      this.columnApi = params.columnApi;
      // 调整表格列宽大小自适应
      this.gridApi.sizeColumnsToFit();
    }
  }
};
</script>

<style scoped>
.table{
  width: 600px;
  height: 200px;
}
</style>

注意:需要同时设置表格列宽自适应,使用minWidth,maxWidth才会生效

14、鼠标单击某单元格选中,获取选中的数据

<template>
  <div>
    <!-- gridReady 绑定一个事件,在表格创建完成后执行 -->
    <!-- 这些属性,不需要绑定,直接给属性值 -->
    <ag-grid-vue class="table ag-theme-balham"
      :columnDefs="columnDefs"
      :rowData="rowData"
      rowSelection="multiple"
      rowHeight="40"
      :enableSorting="true"
      :enableFilter="true"
      :enableColResize="true"
      :gridReady="onGridReady"
      :modelUpdated="onModelUpdated"
      :cellClicked="onCellClicked">
    </ag-grid-vue>
  </div>
</template>

<script>
// 引入ag-grid-vue
import { AgGridVue } from 'ag-grid-vue';
export default {
  components: { AgGridVue },
  data () {
    return {
      gridApi: null,
      columnApi: null,
      columnDefs: [
        {headerName: '', field: '', maxWidth: 44, checkboxSelection: true},
        {headerName: '姓名', field: 'name'},
        {headerName: '性别', field: 'gender'},
        {headerName: '年龄', field: 'age'},
        {headerName: '收入', field: 'income'},
        {headerName: 'ID', field: 'id'}
      ],
      rowData: [
        {name: '李煜', gender: '男', age: 20, income: 2000, id: 1},
        {name: '柳叶', gender: '女', age: 25, income: 2500, id: 2},
        {name: '姜宇', gender: '男', age: 18, income: 1800, id: 3}
      ]
    };
  },
  methods: {
    // 表格创建完成后执行
    onGridReady (params) {
      console.log(params);
      // 获取gridApi
      this.gridApi = params.api;
      this.columnApi = params.columnApi;
      // 调整表格列宽大小自适应
      this.gridApi.sizeColumnsToFit();
    },
    onModelUpdated (param) {
      console.log('onModelUpdated');
      console.log(param);
    },
    onCellClicked (cell) {
      console.log(cell);
      // 获取选中的单元格的数据
      console.log(cell.value);
      // 获取选中的单元格所在的行号,从0开始
      console.log(cell.rowIndex);
      // 获取选中的单元格所在行的所有数据
      console.log(cell.data);
      // 获取选中的单元格所在列的表头的headerName 和 field
      console.log(cell.colDef);
    }
  }
};
</script>

<style scoped>
.table{
  width: 60%;
  height: 240px;
}
</style>

15、总结

在Vue中使用ag-grid,ag-Grid属性使用v-bind进行属性绑定,但是当属性只是一个简单的字符串值时,则不需要绑定,只需将值作为属性放置,例如:

      rowSelection="multiple"  // 设置多选
      rowHeight="40"  // 设置单元格行高

有些事布尔型属性,默认值为false,例如:

      :enableSorting="true"
      :enableFilter="true"
      :enableColResize="true"

有些属性可以注册事件回调,例如:

      :gridReady="onGridReady"
      :modelUpdated="onModelUpdated"
      :cellClicked="onCellClicked"

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值