ag-grid-vue表格--系列1

5,690 阅读3分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

一、前言

我在项目中遇到这么一个难点,订单数据5w+,数据字段在100-250之间,列可拖动,可固定,行数据自适应,用户可自定义字段,可排序,前端分页,可根据所有字段做模糊搜索等。我在实际项目中所采用的表格为ag-grid-vue,因为关于ag-grid-vue表格的中文文档和示例都比较少,这里希望给大家做个参考。本文作为总结和分享。当然,也有其他的表格,请移步到我上期提到的Vue大数据表格

ag-grid中文教程:www.itxst.com/ag-grid/nqr…

ag-grid官方Demo: www.ag-grid.com/example/

ag-grid相关文章: blog.csdn.net/wqearl/cate…

二、ag-grid-vue实际效果

最终效果图如下, 2.gif

【注意】如果这里我做过多的讲解,可能大家听不懂,所以我做了细分

三、ag-grid-vue安装

安装

npm install ag-grid-vue
npm install ag-grid-community

安装版本

    "ag-grid-community": "^27.0.1",
    "ag-grid-vue": "27.1.0",

四、ag-grid-vue简单示例

效果图 4.gif

示例代码:

<template>
  <div class="AgGridVue1">
    <!-- 直接传递的属性和方法优先级大于配置项gridOptions内设置的属性-->
    <!-- :style="style",表格样式 ;
         :class, 表格主题 ;
         :grid-options="agTableOptions.gridOptions"表格配置项;
         :default-col-def="agTableOptions.defaultColDef"全局列配置
         :column-defs="agTableOptions.columnDefs" 列头数据
         :row-data="agTableOptions.rowData" 行数据
         :row-height="30" 行高为30,
         :header-height="40"列头高度
         edit-type="fullRow" 编辑方式,使用键盘上的D或者F2,会打开所在行所有可编辑的单元格【双击编辑又是会失效】
         :enable-col-resize="false" 列自适应,
         row-selection="multiple" 行选择,"multiple"表示为多选;single表示单选;
         :floating-filter="false"筛选行是否开启,true开启,false关闭
     -->
    <AgGridVue
      :id="agTableOptions.id || 'ag-table'"
      :style="agTableOptions.style || { height: '400px', width: '100%' }"
      :class="[`ag-theme-${agTableOptions.theme}`]"
      :grid-options="agTableOptions.gridOptions"
      :column-defs="agTableOptions.columnDefs"
      :row-data="agTableOptions.rowData"
      :enable-col-resize="true"
      :row-selection="agTableOptions.rowSelection || 'multiple'"
      @gridReady="onGridReady"
    />
  </div>
</template>
<script>
import { AgGridVue } from 'ag-grid-vue'

export default {
  name: 'AgGridVue1',
  components: {
    AgGridVue
  },
  data () {
    return {
      agTable: null,
      agTableOptions: {
        id: 'ag-table1',
        theme: 'balham',
        gridOptions: {
          // 分页
          pagination: false, // 【重要】分页已启用,前端分页。
          // paginationPageSize:50 ,// 【重要】数。每页加载多少行。默认值= 100.如果paginationAutoPageSize 指定,则忽略此属性。请参阅自定义分页示例。
          paginationAutoPageSize: true, // 【重要】True - 每页加载的行数由ag-Grid自动调整,因此每个页面显示足够的行以填充为网格指定的区域。是以表格高度为限制,此属性设定之后paginationPageSize:50失效
          // suppressPaginationPanel: true, // True - 开箱即用的ag-Grid导航控件是隐藏的。如果pagination=true您想要提供自己的分页控件,这将非常有用 。 False(默认) - 当pagination=true它自动在底部显示必要的控件,以便用户可以浏览不同的页面。请参见示例自定义分页控件。
          rowHeight: 34, // 【重要】默认行高度(以像素为单位)。默认值为30。
          animateRows: true, // 【重要】设置为true以启用行动画。 那个数据刷新的蓝色行底色,适用于数据刷新的
          rowStyle: {
            'font-weight': '400',
            color: '#999',
            'font-size': '14px'
          }, // 【重要】给出特定行的样式。请参见行样式。
          // 列头默认配置项
          defaultColDef: {
            sort: 'asc', // 前端排序方式 asc 顺序 desc倒序,还有自定义拍序 .优先顺序为 sortable为true,才能设置排序方法,sort与 comparator 不能共存
            // comparator: dateComparator, // 自定义排序,dateComparator为排序方法名
            sortable: true, // 是否开启排序,这个是展示原本的列头排序,当sort设置不是true时,有数字展示;操作之后就消失
            resizable: true, // true可以拖动改变列的大小,false不允许用户拖动改变列大小
            filter: true, // 是否显示筛选
            minWidth: 100, // 【重要】最小宽度, 最小和最大宽度可限制列拖动
            maxWidth: 350 // 【重要】最大宽度
          }
        },
        // 行数据
        rowData: [],
        // 列头配置
        columnDefs: [
          // 首列全选或单选列
          // {
          //   headerName: '#',
          //   field: 'numericalOrder',
          //   width: 120,
          //   // initialPinned: 'left', // 固定在左方
          //   pinned: 'left', // 固定在左侧
          //   lockPosition: true, // 锁定位置,默认为false,该属性设置为true时,拖拽列无效;如果不设置pinned: 'right', 默认展示在最左方
          //   checkboxSelection: true, // 设置当前列有可选项
          //   filter: false,
          //   headerCheckboxSelection: true,
          //   headerCheckboxSelectionFilteredOnly: true
          // },
          {
            headerName: '姓名',
            field: 'name',
            pinned: 'left', // 固定在左侧
            headerComponentParams: { menuIcon: 'fa-cog' },

            // checkboxSelection: true, // 单行的单个复选框
            // tooltipField: 'status',
            // sortable: false, // false禁止排序, true允许排序
            // comparator: dateComparator, // 自定义排序,dateComparator为排序方法名
            // 给单元格添加特定的其他标签
            cellRenderer: function (params) {
              const getDom = (color = '#E6A23C') => {
                return (
                  `<span style="background-color:${color};display:inline-block;width:5px;height:5px;border-radius:5px;margin-right:5px;margin-bottom:2px"></span>` +
                  params.value
                )
              }
              if (params.value === '李四') {
                return getDom('#E6A23C')
              } else if (params.value === '王五') {
                return getDom('#ffffff')
              } else {
                return params.value
              }
            },
            // 单元格样式颜色
            cellStyle: function (params) {
              let color = '#25262e'
              if (params.value === '张三') {
                color = '#b4b61a'
              } else if (params.value === '李四') {
                color = '#3a65ff'
              } else if (params.value === '王五') {
                color = '#1AB66C'
              } else if (params.value === '王五3') {
                color = '#DC143C'
              } else if (params.value === '') {
                color = '#ffffff'
              }
              return { color: '#fff', background: color }
            },

            tooltipValueGetter: function (params) {
              return params.value === '王五2' ? '更改王五2' : params.value
            },
            // 单元格数据过滤
            valueFormatter: function (params) {
              // console.log('params', params)
              return params.value === '王五4' ? '更改王五4' : params.value
            }
          },
          {
            headerName: '性别',
            field: 'sex',
            editable: true,
            cellEditor: 'agSelectCellEditor', // 编辑时 显示下拉列表
            cellEditorParams: { values: ['男', '女'] }
          },
          {
            headerName: '年龄年龄龄年龄年龄',
            field: 'age',
            sort: 'desc'
          },
          {
            headerName: '年龄1',
            field: 'age1',
            sort: 'desc'
          },
          {
            headerName: '年龄之和',
            field: 'age2',
            sort: 'desc',
            cellRenderer: (params) => {
              return Number(params.data.age) + Number(params.data.age1)
            }
          },
          {
            headerName: '籍贯',
            field: 'jg',

            filterParams: {
              buttons: ['apply', 'reset'],
              closeOnApply: true
            }
          },
          {
            headerName: '省份',
            field: 'sf',
            tooltipField: 'sf',
            tooltipComponentParams: { color: '#ececec' },
            floatingFilterComponentParams: {
              suppressFilterButton: true,
              color: 'red'
            }
          },
          {
            headerName: '地址',
            field: 'dz',

            tooltipField: 'dz',
            editable: true, // 如果defaultColDef未全局声明editable: true,单个的列想用,就必须单独声明
            cellEditor: 'agLargeTextCellEditor', // 编辑时 显示长文本框
            cellEditorParams: {
              maxLength: '100', // 能输入的文本长度限制
              cols: '50', // 显示为10宽度
              rows: '2' // 显示为1行的高度
            }
          },
          {
            headerName: '时间',
            field: 'date'
          }
        ],
        // 行选择配置: 单选single/多选multiple
        rowSelection: 'multiple'
      }
    }
  },
  methods: {
    onGridReady (params) {
      this.agTable = params
      const rowData = this.getRowData()
      console.log('rowData=====>', rowData)
      params.api.setRowData(rowData)
    },

    // 获取0-9的随机数
    getRandom9 () {
      const randNum = Math.random()
      const random_1 = randNum + ''
      const age = (randNum * 100).toFixed(2)
      const age1 = (randNum * 500).toFixed(2)
      const sex = random_1 > 0.5 ? '男' : '女'
      const ran = random_1.charAt(3)
      // console.log("随机数ran", ran);
      return { ran, sex, age, age1 }
    },
    // 生成随机时间
    getRandomDate () {
      var maxdaterandom = new Date().getTime()
      // 由于当前环境为北京GMT+8时区,所以与GMT有8个小时的差值
      var mindaterandom = new Date(1970, 0, 1, 8).getTime()
      var randomdate = this.getRandom(mindaterandom, maxdaterandom)
      const ranDate = new Date(randomdate)
      const year = ranDate.getFullYear()
      const mon = ranDate.getMonth() + 1
      const month = mon < 10 ? '0' + mon : mon
      const day =
        ranDate.getDate() < 10 ? '0' + ranDate.getDate() : ranDate.getDate()
      var dateStr = `${year}-${month}-${day}`
      // console.log(dateStr);
      return dateStr
    },
    // 生成随机时间的随机数
    getRandom (min, max) {
      min = Math.ceil(min)
      max = Math.floor(max)
      return Math.floor(Math.random() * (max - min + 1)) + min
    },
    // 获取行单元格数据
    getRowData () {
      const item = {
        name: '王五',
        sex: '男',
        age: '35',
        jg: '中国',
        sf: '浙江',
        dz: '杭州市古墩路12号',
        date: '2021-10-06'
      }
      const nameArr = [
        '张三',
        '李四',
        '王五',
        '王五1',
        '王五2',
        '王五3',
        '王五4',
        '王五5',
        '王五6',
        '王五7'
      ]
      const newData = []
      for (let i = 0; i < 999; i++) {
        const cell = JSON.parse(JSON.stringify(item))
        const random = this.getRandom9()
        cell.age = random.age
        cell.age1 = random.age1
        cell.name = nameArr[random.ran]
        cell.sex = random.sex
        cell.date = this.getRandomDate()
        newData.push(cell)
      }
      console.log('模拟数据', newData)
      return newData
    }
  }
}
</script>

以上的简单示例,可能已经满足大部分人的需求了,所有属性的介绍都放置于代码中,请放心食用

前端人,fish is you

1662272014218.png

完结散花...