Vue 2 安装并使用 Ag-Grid ^31.3.4、样式、中文化、组件设计


总结

  • Vue2 中只能安装 Ag-grid v31.3 版本,此说法的来源 Get Started with AG Grid
    在这里插入图片描述

  • Ag-grid 给的安装命令,默认是安装大于 v31.3 的,所以安装的时候要指定版本 npm install ag-grid-community@31.3


Vue 2 中的效果

在这里插入图片描述


依赖环境

我的 vue 的版本是 2.6.10 ,(后面升到了 ^2.7.16 了)

在这里插入图片描述


Vue2 安装 Ag-Grid

首先 ,根据官网上的描述,vue2 只支持到 v31.3,所以就只安装这个版本 点我跳转到官方的描述

npm install ag-grid-community@31.3        

我的依赖包添加了三个

在这里插入图片描述


运行项目后报错

在这里插入图片描述

解决办法是

在这里插入图片描述
vue.config.js 中添加这句话

这段配置的作用是让 Webpack 处理 node_modules 目录下以 .mjs 结尾的文件,并自动检测这些文件的内容来决定如何解析它们。

module: {
  rules: [{
    test: /\.mjs$/,
    include: /node_modules/,
    type: 'javascript/auto'
  }]
}

引入需要的样式

main.js 中引入

在这里插入图片描述


测试是否可以使用

直接写个组件,引入下面的代码快速测试一下

在这里插入图片描述

<template>
  <div class="divBox">
    <el-card>
      <ag-grid-vue style="width: 500px; height: 200px" class="ag-theme-quartz" :columnDefs="columnDefs"
        :rowData="rowData">
      </ag-grid-vue>
    </el-card>
  </div>
</template>

<script>
import { AgGridVue } from "ag-grid-vue";

export default {
  name: '',
  components: {
    AgGridVue
  },
  beforeMount() {
    this.columnDefs = [
      { field: "make" },
      { field: "model" },
      { field: "price" },
    ];

    this.rowData = [
      { make: "Toyota", model: "Celica", price: 35000 },
      { make: "Ford", model: "Mondeo", price: 32000 },
      { make: "Porsche", model: "Boxster", price: 72000 },
    ];
  },
}
</script>
<style scoped lang='scss'>
.button-box {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin: 10px 0;

  .button-box-left {
    display: flex;
    align-items: center;
  }
}
</style>

使用配置方面

汉语配置

安装这个依赖 @ag-grid-community/locale

然后引入

在这里插入图片描述

之后验证一下是否汉化

在这里插入图片描述


Tooltip 的添加

效果如下

在这里插入图片描述

需要有 tooltipShowDelay

columnDefs: [
	{
	  field: "shortname", headerName: "材料名称", filter: true, width: 240, pinned: 'left',
	  tooltipValueGetter: (p) => p.value,
	},
],
gridOptions: {
  tooltipShowDelay: 500,
  // tooltip 只有添加 tooltipShowDelay 才会显示
}

整体代码如下:

在这里插入图片描述


组件版本会影响自定义组件的渲染的方法

需求:Ag-Grid 添加操作列,如下图所示
问题:我用 ^25 版本的方法引入组件,在 ^25 版本是可以渲染的,但是 ^31.3.4 不可以了
猜测:可能的原因是渲染的方法改变了,v25 的方法,v31 的已经不兼容了

在这里插入图片描述


测试1. 版本回退到 ^25

如果 版本都退回到 25, 直接渲染会报错

在这里插入图片描述
先注册,之后再指定组件,这是正常的
在这里插入图片描述

准备升级组件版本,删除 node_module,重新安装依赖,重启项目

测试2. ag-grid-vue v31.3.4 + ag-grid-community v25 的组合

在这里插入图片描述

准备另一个组件版本,删除 node_module,重新安装依赖,重启项目

测试3. ag-grid-vue v25 + ag-grid-community v31.3.4 的组合

在这里插入图片描述
报错了

Error in mounted hook: "TypeError: Class constructor BaseComponentWrapper cannot be invoked without 'new'"

found in

之后升级 ag-grid-community 保持版本一致的话,ag-grid 是正常的,不过组件渲染不出来

在这里插入图片描述

测试4. v31.3.4 可正常渲染的代码使用

这样可以,需要在局部组件中先注册一下
这里我的操作按钮组件是 Setter,先注册,然后再 cellRenderer 中传递组件的名字
在这里插入图片描述

在这里插入图片描述

这里演示一下效果

在这里插入图片描述
也可以这样写

cellRendererSelector: (params) => {
 return {
    component: 'Setter', // 动态选择组件
  };
},

这两个接口的 Api 文档在这里

  1. reference-styling-cellRendererSelector
  2. reference-styling-cellRenderer


自定义组件的数据流转,以及事件定义

数据流如下
在这里插入图片描述

这个演示一下

在这里插入图片描述

踩坑:按钮组件最好静态引入,动态引入会报错

这个是动态引入

在这里插入图片描述


代码: 简单封装带有操作列的通用组件

下面的代码是已经封装好的,方便开发的思路,

  • 其中 index.vue 是核心封装 ag-grid
  • Setter.vue 是操作列的组件
  • useExample 是使用的例子
// MyAgGrid: index.vue
<template>
  <AgGridVue style="width:100%; height: calc(100vh - 270px)" :class="theme" :columnDefs="mergedColumnDefs"
    :rowData="rowData" :gridOptions="mergedGridOptions" />
</template>

<script>
import { AgGridVue } from "ag-grid-vue";
import { AG_GRID_LOCALE_CN } from '@ag-grid-community/locale';
import Setter from '@/components/MyAgGrid/components/Setter.vue'

export default {
  name: 'MyAgGrid',
  components: {
    AgGridVue,
    Setter
  },
  props: {
    theme: {
      type: String,
      default: 'ag-theme-quartz'
    },
    columnDefs: {
      type: Array,
      default: () => []
    },
    rowData: {
      type: Array,
      default: () => []
    },
    gridOptions: {
      type: Object,
      default: () => ({})
    }
  },
  data() {
    return {
      defaultGridOptions: {
        tooltipShowDelay: 1000,  // tooltip 只有添加 tooltipShowDelay 才会显示
        localeText: AG_GRID_LOCALE_CN,
      },
      defaultColumnDefs: [
        {
          headerName: "操作",
          width: 100,
          field: "setter",
          pinned: 'right',
          cellRenderer: 'Setter',
          cellRendererParams: {
            actionHandler: this.handleAction, // 传递点击处理方法
            actionDelete: this.handleDelete
          }
        }
      ],
    }
  },
  computed: {
    mergedGridOptions() {
      return { ...this.defaultGridOptions, ...this.gridOptions };
    },
    mergedColumnDefs() {
      return [...this.defaultColumnDefs, ...this.columnDefs];
    }
  },
  methods: {
    handleAction(data) {
      this.$emit('handleAction', data)
    },
    handleDelete(data) {
      this.$emit('handleDelete', data)
    },
  },
}
</script>
<style scoped lang='scss'></style>

操作组件 Setter.vue

// Setter.vue
<template>
  <div class="setter">
    <el-tooltip class="item" effect="light" content="删除" placement="bottom-start">
      <i class="el-icon-delete" @click="delRow"></i>
    </el-tooltip>
    <el-tooltip class="item" effect="light" content="编辑" placement="bottom-start">
      <i class="el-icon-document" @click="setRow"></i>
    </el-tooltip>
  </div>
</template>

<script>
export default {
  name: 'Setter',
  methods: {
    //图标事件
    setRow() {
      // this.$parent.$emit('setter', this.params.api.getFocusedCell());
      // console.log('点击设置按钮:>>')
      this.params.actionHandler(this.params.data)
    },
    //删除数据
    delRow() {
      // console.log('点击删除按钮:>>')
      this.params.actionDelete(this.params.data)
    }
  }
}
</script>

使用样例 useExample.vue

// useExample.vue
<template>
  <MyAgGrid :columnDefs="grid.columnDefs" :rowData="grid.rowData" @handleDelete="handleDelete"
    @handleAction="handleAction" />
</template>

<script>
import MyAgGrid from '@/components/MyAgGrid/index.vue'
export default {
  name: 'useExample',
  components: {
    MyAgGrid,
  },
  data() {
    return {
      grid: {
        columnDefs: [
          { field: "enterprise_name", headerName: "图片", filter: true, width: 100, pinned: 'left', tooltipValueGetter: (p) => p.value, },
          { field: "number", headerName: "材料编号", filter: true, width: 180, pinned: 'left', tooltipValueGetter: (p) => p.value, },
          { field: "shortname", headerName: "材料名称", filter: true, width: 240, pinned: 'left', tooltipValueGetter: (p) => p.value, },
        ],
        rowData: [],
      },
    }
  },
  methods: {
    handleDelete(rowData) {
      console.log('handleDelete:>>', rowData)
    },
    handleAction(rowData) {
      console.log('handleAction:>>', rowData)
    },
  }
}
</script>

ag-Grid Vue 是一个用于构建灵活的、高性能的数据表格和数据网格的 Vue 组件库。它是与 Vue 框架集成的 ag-Grid 社区版。使用 ag-Grid Vue,您可以轻松地在 Vue 应用程序中创建功能丰富的数据表格和网格,利用 ag-Grid 提供的丰富功能和性能优势。 要在 Vue 应用程序中使用 ag-Grid Vue,您需要先安装 ag-Grid Vue 包。您可以使用 npm 或 yarn 进行安装: ```bash npm install --save ag-grid-vue # 或 yarn add ag-grid-vue ``` 安装完成后,您可以在 Vue 组件中引入使用 ag-Grid Vue: ```vue <template> <ag-grid-vue :columnDefs="columnDefs" :rowData="rowData" class="ag-theme-alpine" ></ag-grid-vue> </template> <script> import { AgGridVue } from &#39;ag-grid-vue&#39;; export default { components: { AgGridVue, }, data() { return { columnDefs: [...], // 列定义 rowData: [...], // 行数据 }; }, }; </script> <style> @import &#39;~ag-grid-community/dist/styles/ag-grid.css&#39;; @import &#39;~ag-grid-community/dist/styles/ag-theme-alpine.css&#39;; </style> ``` 在上面的示例中,您可以通过传递列定义(columnDefs)和行数据(rowData)来配置 ag-Grid Vue 组件。您还需要为 ag-Grid 使用的主题样式添加对应的 CSS。 只是一个简单的示例,您可以根据您的需求和数据结构进行更多的配置和自定义。您可以参考 ag-Grid Vue 的官方文档以获取更多详细信息和示例代码。希望这可以帮助您开始使用 ag-Grid Vue!如果有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值