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"