AgGrid 组件封装设计笔记:自定义 icon 以及每个 icon 的点击事件处理

文章目录

  • 问题
  • 目前解决效果 v1
    • 思路
  • 目前解决效果 v0
    • 思路
  • 代码
    • V1


问题

自己封装的 AgGrid 如何自定义传递 icon ,以及点击事件的处理?


目前解决效果 v1

在这里插入图片描述

思路

在这里插入图片描述


目前解决效果 v0

在这里插入图片描述


思路

一张图片说明一下

在这里插入图片描述

代码

V1

父组件使用

<template>
  <MyPageLayout @handleSearch="handleSearch">
    <MyAgGrid :columnDefs="grid.columnDefs" :rowData="grid.rowData" :gridOptions="grid.gridOptions"
      :setterIcon="setterIcon" @handleAction="handleAction" :setterWidth="120" ref="myAgGridRef" />
  </MyPageLayout>
</template>

<script>
import MyPageLayout from '@/components/MyPageLayout/index.vue'
import MyAgGrid from '@/components/MyAgGrid/index_v1.vue'
import svgComponent from './svgComponent.vue'

export default {
  name: 'classOfSilo',
  components: {
    MyPageLayout,
    MyAgGrid,
  },
  data() {
    return {
      setterIcon: [
        { icon: `<span>1</span>`, tip: 'html' },
        { icon: svgComponent, tip: 'component' },
        { icon: 'el-icon-eleme', tip: '11' },
        { icon: 'el-icon-s-tools', tip: '22' },
        { icon: 'el-icon-phone', tip: '33' },
      ],

    };
  },
}
</script>

svgComponent

<template>
  <img :src="findsvg" class="find-svg" />
</template>

<script>
import findsvg from '@/assets/erp-icons/find-replace.svg';
export default {
  name: 'findsvg',
  data() {
    return {
      findsvg
    }
  },
  methods: {

  }
}
</script>

<style lang="scss" scoped>
.find-svg {
  width: 16px;
  height: 16px;
  cursor: pointer;
  position: relative;
  top: -2px;
}
</style>

二次封装 MyAgGrid

<template>
  <AgGridVue :style="myStyle" :class="theme" :columnDefs="mergedColumnDefs" :rowData="rowData"
    :gridOptions="mergedGridOptions" @grid-ready="onGridReady">
  </AgGridVue>
</template>

<script>
import { AgGridVue } from "@ag-grid-community/vue";
import { ModuleRegistry } from '@ag-grid-community/core';
import { AG_GRID_LOCALE_CN } from '@ag-grid-community/locale';
import { RowGroupingModule } from '@ag-grid-enterprise/row-grouping';
import { ClientSideRowModelModule } from '@ag-grid-community/client-side-row-model';
import Setter from '@/components/MyAgGrid/components/Setter.vue'

ModuleRegistry.registerModules([
  ClientSideRowModelModule,
  RowGroupingModule
]);

export default {
  name: 'MyAgGrid',
  components: {
    AgGridVue,
    Setter,
  },
  props: {
    theme: {
      type: String,
      // default: 'ag-theme-quartz-dark'
      default: 'ag-theme-quartz'
    },
    columnDefs: {
      type: Array,
      default: () => []
    },
    rowData: {
      type: Array,
      default: () => []
    },
    gridOptions: {
      type: Object,
      default: () => ({})
    },
    isShowTips: {
      type: Boolean,
      default: true
    },
    myStyle: {
      type: Object,
      default: () => ({ width: '100%', height: 'calc(100vh - 270px)' })
    },
    showDefaultColumnDefs: {
      type: Boolean,
      default: true
    },
    setterIcon: {
      type: Array,
      default: () => [
        { icon: 'el-icon-edit', tip: '编辑' },
        { icon: 'el-icon-delete', tip: '删除' }
      ]
    },
    setterWidth: {
      type: Number,
      default: 70
    }
  },
  data() {
    return {
      defaultGridOptions: {
        tooltipShowDelay: 1000,  // tooltip 只有添加 tooltipShowDelay 才会显示
        localeText: AG_GRID_LOCALE_CN,
        animateRows: true, // 添加这一行
      },
      defaultColumnDefs: [
        {
          headerName: "操作",
          width: this.setterWidth,
          field: "setter",
          pinned: 'right',
          cellRenderer: 'Setter',
          cellRendererParams: {
            isShowTips: this.isShowTips,
            setterIcon: this.setterIcon,
            actionHandler: this.handleAction, // 传递点击处理方法
          },
          resizable: true
        }
      ],
      gridApi: null
    }
  },
  computed: {
    mergedGridOptions() {
      return { ...this.defaultGridOptions, ...this.gridOptions };
    },
    mergedColumnDefs() {
      if (this.showDefaultColumnDefs == false) {
        return [...this.columnDefs]
      }
      return [...this.defaultColumnDefs, ...this.columnDefs];
    }
  },
  methods: {
    getGridApi() {
      return this.gridApi
    },
    onGridReady(params) {
      this.gridApi = params.api
    },
    handleAction(index, rowData) {
      this.$emit('handleAction', index, rowData)
    },
  },
}
</script>

<style scoped lang="scss">
::v-deep .ag-pinned-right-header {

  // margin-right: 16px;
  .ag-header-row-column {
    padding-right: 16px;
  }
}

::v-deep .ag-pinned-left-header {
  border-right: none;
}

::v-deep .ag-pinned-right-cols-container {
  margin-right: 0 !important;
}

::v-deep .ag-center-cols-container {
  margin-right: 0 !important;
}

/deep/ .ag-root-wrapper {
  border-radius: 0;
}
</style>

Setter.vue

<template>
  <div class="setter">
    <template v-for="(item, index) in iconList">
      <el-tooltip v-if="isShowTips" class="item" effect="light" :content="item.tip" placement="bottom-start"
        :key="`icon-${index}`">
        <RenderIcon :icon="item.icon" class="icon-wrapper" @click.native="clickIcon(index)" />
      </el-tooltip>
      <RenderIcon v-else :icon="item.icon" class="icon-wrapper" @click.native="clickIcon(index)" />
    </template>
  </div>
</template>

<script>
export default {
  name: "Setter",
  components: {
    RenderIcon: {
      props: {
        icon: {
          type: [Object, String],
          required: true,
        },
      },
      methods: {
        isComponent(icon) {
          return typeof icon === "object" && icon !== null && typeof icon.render === "function";
        },
        isHtmlTag(icon) {
          const htmlTagRegex = /^<([a-zA-Z][a-zA-Z0-9]*)\b[^>]*>(.*?)<\/\1>$/;
          return typeof icon === "string" && htmlTagRegex.test(icon);
        },
      },
      render(h) {
        const { icon } = this;
        if (this.isComponent(icon)) {
          return h(icon, { class: "mr6" });
        } else if (this.isHtmlTag(icon)) {
          return h("span", { domProps: { innerHTML: icon }, class: "mr6" });
        } else {
          return h("i", { class: `mr6 ${icon}` });
        }
      },
    },
  },
  computed: {
    iconList() {
      return this.params.setterIcon;
    },
    isShowTips() {
      return this.params.isShowTips;
    },
  },
  methods: {
    clickIcon(index) {
      this.params.actionHandler(index, this.params.data);
    },
  },
};
</script>

<style lang="scss" scoped>
.mr6 {
  margin-right: 6px;
}

.icon-wrapper {
  cursor: pointer;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/929278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL——MySQL 日志

文章目录 MySQL 文件介绍二进制日志&#xff08;bin log&#xff09;概念binlog 日志的三种格式两阶段提交binlog 落盘更新语句执行流程 慢查询日志&#xff08;slow query log&#xff09;重做日志&#xff08;redo log&#xff09;redo log 日志的理解WAL 技术redo log 的工作…

解决git did not exit cleanly (exit code 128)问题

解决 git did not exit cleanly &#xff08;exit code 128&#xff09;问题 1、错误描述2、解决方法2.1 方法一2.2 方法二 1、错误描述 使用TortoiseGit进行操作时&#xff0c;总是提示下述错误。 2、解决方法 2.1 方法一 打开 TortoiseGit -> Settings 点击 Network&…

家校通小程序实战教程05教师登录

目录 1 搭建角色选择页面2 设置登录方法3 创建加入班级页面4 创建教师主页页面5 完善登录方法总结 我们上一篇开发了教师管理的后台功能&#xff0c;后台一般是给管理员提供的。教师一般是使用小程序开展各类业务&#xff0c;本篇介绍一下教师如何通过小程序登录。 1 搭建角色选…

yolov5 解决:export GIT_PYTHON_REFRESH=quiet

当我们在第一次运行YOLOv5中的train.py程序时&#xff1a;可能会出现以下报错&#xff1a; This initial warning can be silenced or aggravated in the future by setting the $GIT_PYTHON_REFRESH environment variable. Use one of the following values: - quiet|q|silen…

neo4j如何存储关于liquidity structure的层次和关联结构

在 Neo4j 中存储关于流动性结构&#xff08;liquidity structure&#xff09;的层次和关联结构非常适合&#xff0c;因为 Neo4j 是一个基于图的数据库&#xff0c;能够自然地建模和存储复杂的关系和层次结构。下面是如何在 Neo4j 中设计和实现这样的数据模型的详细步骤和示例。…

SpringBoot高级-底层原理

目录 1 SpringBoot自动化配置原理 01-SpringBoot2高级-starter依赖管理机制 02-SpringBoot2高级-自动化配置初体验 03-SpringBoot2高级-底层原理-Configuration配置注解 04-SpringBoot2高级-底层原理-Import注解使用1 05-SpringBoot2高级-底层原理-Import注解使用2 06-S…

C++模拟堆

模板题目 图片来源Acwing 堆的基础知识 代码实现 #include<iostream> #include<algorithm>using namespace std;const int N 1e5 10; int a[N]; int n, m;void down(int u) {int t u;if (2 * u < n && a[2 * u] < a[u]){t 2 * u;}if (2 * u …

RNACOS:用Rust实现的Nacos服务

RNACOS是一个使用Rust语言开发的Nacos服务实现&#xff0c;它继承了Nacos的所有核心功能&#xff0c;并在此基础上进行了优化和改进。作为一个轻量级、快速、稳定且高性能的服务&#xff0c;RNACOS不仅包含了注册中心、配置中心和Web管理控制台的功能&#xff0c;还支持单机和集…

Flink常见面试题

1、Flink 的四大特征&#xff08;基石&#xff09; 2、Flink 中都有哪些 Source&#xff0c;哪些 Sink&#xff0c;哪些算子&#xff08;方法&#xff09; 预定义Source 基于本地集合的source&#xff08;Collection-based-source&#xff09; 基于文件的source&#xff08;…

BERT和RoBERTa;双向表示与单向的简单理解

目录 BERT和RoBERTa大型预训练语言模型 BERT的原理 RoBERTa的原理 举例说明 双向表示与单向的简单理解 除了预训练语言模型,还有什么模型 一、模型类型与结构 二、训练方式与数据 三、应用场景与功能 四、技术特点与优势 BERT和RoBERTa大型预训练语言模型 BERT(Bi…

OpenAI 推出了 Canvas 和 SearchGPT

今天的故事从 ChatGPT 推出的 Canvas 和 SearchGPT 开始。 ©作者|Ninja Geek 来源|神州问学 ChatGPT 在最近推出了令人兴奋的 Canvas 功能&#xff0c;Canvas 不仅带来了 ChatGPT 界面上的变化&#xff0c;还完全改变了人们撰写文档和书写代码的体验&#xff01; Canvas…

CentOS 9 配置静态IP

文章目录 1_问题原因2_nmcli 配置静态IP3_使用配置文件固定IP4_重启后存在的问题5_nmcli 补充 1_问题原因 CentOS 7 于 2014年6月发布&#xff0c;基于 RHEL 7&#xff0c;并在 2024年6月30日 结束维护。 CentOS 9 作为目前的最新版本&#xff0c;今天闲来闲来无事下载下来后…

ProjectSend 身份认证绕过漏洞复现(CVE-2024-11680)

0x01 产品描述: ProjectSend 是一个开源文件共享网络应用程序,旨在促进服务器管理员和客户端之间的安全、私密文件传输。它是一款相当流行的应用程序,被更喜欢自托管解决方案而不是 Google Drive 和 Dropbox 等第三方服务的组织使用。0x02 漏洞描述: ProjectSend r1720 之前…

【Vulkan入门】01-列举物理设备

目录 先叨叨git信息主要逻辑VulkanEnvEnumeratePhysicalDevices()PrintPhysicalDevices() 编译并运行程序 先叨叨 上一篇已经创建了VkInstance&#xff0c;本篇我们问问VkInstance&#xff0c;在当前平台上有多少个支持Vulkan的物理设备。 git信息 repository: https://gite…

小家电出海,沃丰科技助力保障售后服务的及时性与高效性

随着全球化步伐的加快&#xff0c;小家电行业也逐渐迈向国际市场&#xff0c;面向全球消费者提供服务。然而&#xff0c;跨国界的销售和服务挑战也随之而来&#xff0c;尤其是售后服务的及时性与高效性成为了企业亟需解决的问题。沃丰科技凭借其全渠道在线客服、工单系统和视频…

AI RPA 影刀基础教程:开启自动化之旅

RPA 是什么 RPA 就是机器人流程自动化&#xff0c;就是将重复的工作交给机器人来执行。只要是标准化的、重复的、有逻辑行的操作&#xff0c;都可以用 RPA 提效 准备 安装并注册影刀 影刀RPA - 影刀官网 安装 Chrome 浏览器 下载链接&#xff1a;Google Chrome 网络浏览器 …

Qt 2D绘图之五:图形视图框架的结构、坐标系统和框架间的事件处理与传播

参考文章链接: Qt 2D绘图之五:图形视图框架的结构和坐标系统 Qt 2D绘图之六:图形视图框架的事件处理与传播 图形视图框架的结构 在前面讲的基本绘图中,我们可以自己绘制各种图形,并且控制它们。但是,如果需要同时绘制很多个相同或不同的图形,并且要控制它们的移动、…

JavaScript 键盘控制移动

如果你想通过 JavaScript 实现键盘控制对象&#xff08;比如一个方块&#xff09;的移动&#xff0c;下面是一个简单的示例&#xff0c;展示如何监听键盘事件并根据按下的键来移动一个元素。 HTML 和 CSS&#xff1a; <!DOCTYPE html> <html lang"en">…

【Web】0基础学Web—html基本骨架、语义化标签、非语义化标签、列表、表格、表单

0基础学Web—html基本骨架、语义化标签、非语义化标签、列表、表格、表单 html基本骨架语义化标签图片属性a链接 非语义化标签特殊符号标签 列表无序列表结果展示 有序列表结果展示 定义列表结果展示 表格table属性tr属性结果展示 表单单标签form属性input属性selecttextareabu…

find / -name ‘*.jar‘ 需要加上英文单引号 (shell 的通配符展开行为)

文章目录 1. Shell 通配符展开&#xff08;Glob Expansion&#xff09;2. 有引号时的行为&#xff08;推荐&#xff09;3. 无引号时的行为4. 总结原因5. 推荐实践 rootiZuf67xiyefycct0a9rdi3Z:~# find / -name *.jar find: paths must precede expression: o2o.jar Usage: fin…