【AntV】canvas表格s2完全封装手册

news2024/12/24 21:58:45

前言

由于我们业务中有很多地方需要有纵向复制,刷选等操作,一般的传统表格并不支持。

目前支持度较好的葡萄城表格与handsontable都需要收费,而s2作为一款轻量级开源表单较为符合我们的需求,但是由于s2仍然不够成熟,有非常多的功能需要自定义。

我在公司对s2做了大量封装,对里面代码基本上算比较熟悉了。本篇结合我们业务中的需求,带大家看看s2可以做到什么地步,需要进行怎样的改动。

引入方式与注意点

传统引入方式就是npm与umd的这里就不说了,值得说一下的就是模块联邦引入。

正常情况使用模块联邦打包share出去
在这里插入图片描述

需要引入的项目里同样需要配上share,否则全局变量部分就会有问题,如果s2的表格的hover效果刷选效果全都消失可能是这个原因导致的(我们遇到2个项目出现这问题,加上就好)。

s2前置知识

官网:https://s2.antv.antgroup.com/

对于完全没接触过s2的同学来说,有些概念需要先了解下,便于后面更快地对s2进行改造。

s2表格从大类上分明细表与透视表,其他表都是2个表的延伸:

image.png

透视表比明细表多了角头与行头,它只有列头与数据。

一般业务需求基本都是明细表,只有少部分需求会用到多维表。多维表的行头可以转换成树结构,可以做要求较低的树状表格。

s2是基于图引擎g做的,目前2版本使用的是4版本的g:https://g.antv.vision/zh/docs/guide/introduce

如果需要对单元格等进行自定义,一般会需要使用g进行绘制。

s2的自定义扩展基本都是需要继承之前的类。比如列头就要继承colCell,单元格就要继承DataCell。所以你需要改什么就去继承重写就可以了。

比如下面这个例子就是全部改写单元格(datacell)的效果:
在这里插入图片描述

主题修改

我觉得官网文档上主题修改讲的挺详细的了,就是修改themeCfg

默认色板可以通过getPalette获取,如果只想改主题色,换掉brandColor即可。

const palette = getPalette("default");
const color = generatePalette({
   
	...palette,
	brandColor: "#ff6f00",
});

直接看官网这部分即可https://s2.antv.antgroup.com/zh/examples/theme/custom/#custom-manual-palette

由于s2-react使用了antd4做组件,所以当你改了颜色后,antd的主题色最好也需要更改,否则会比较突兀:

@import "~antd/es/style/themes/default.less";
@import "~antd/dist/antd.less"; 
@primary-color: #ff6f00; // 全局主色
@link-color: #ff6f00; // 链接色

导入less换变量即可。如果编译报错,可以开启lessOption:

{
   
        loader: "less-loader",
        options: {
   
                lessOptions: {
   
                        javascriptEnabled: true,
                },
        },
},

svgIcon

s2的svg引入稍微有点坑,所以这里抽出来写一下。

一般我们使用的icon需要注册到headerActionIcons中进行使用。s2会将你配置的图标以及名称放到全局变量上,等需要的时候拿取。

在列头行头等地方需要拿取icon时,s2有个icon类会去修改fill(如果使用网络图片就不会受影响),具体代码是这么写的:

/**
 * 使用 iconfont 上的 svg 来创建 Icon
 */
export class GuiIcon extends Group {
   
  static type = '__GUI_ICON__';

  // icon 对应的 GImage 对象
  public iconImageShape: Shape.Image;

  constructor(cfg: GuiIconCfg) {
   
    super(cfg);
    this.render();
  }

  // 获取 Image 实例,使用缓存,以避免滚动时因重复的 new Image() 耗时导致的闪烁问题
  /* 异步获取 image 实例 */
  public getImage(
    name: string,
    cacheKey: string,
    fill?: string,
  ): Promise<HTMLImageElement> {
   
    return new Promise<HTMLImageElement>((resolve, reject): void => {
   
      let svg = getIcon(name);
      if (!svg) {
   
        return;
      }

      const img = new Image();
      img.onload = () => {
   
        ImageCache[cacheKey] = img;
        resolve(img);
      };
      img.onerror = reject;

      // 兼容三种情况
      // 1、base 64
      // 2、svg本地文件(兼容老方式,可以改颜色)
      // 3、线上支持的图片地址
      if (svg.includes(SVG_CONTENT_TYPE) || this.isOnlineLink(svg)) {
   
        img.src = svg;
      } else {
   
        // 传入 svg 字符串(支持颜色fill)
        if (fill) {
   
          // 如果有fill,移除原来的 fill
          // 这里有一个潜在的问题,不同的svg里面的schema不尽相同,导致这个正则考虑不全
          // 1、fill='' 2、fill 3、fill-***(不需要处理)
          // eslint-disable-next-line no-useless-escape
          svg = svg.replace(/fill=[\'\"]#?\w+[\'\"]/g, ''); // 移除 fill="red|#fff"
          svg = svg.replace(/fill>/g, '>'); // fill> 替换为 >
        }
        svg = svg.replace(
          STYLE_PLACEHOLDER,
          `${
     STYLE_PLACEHOLDER} fill="${
     fill}"`,
        );
        // 兼容 Firefox: https://github.com/antvis/S2/issues/1571 https://stackoverflow.com/questions/30733607/svg-data-image-not-working-as-a-background-image-in-a-pseudo-element/30733736#30733736
        // https://www.chromestatus.com/features/5656049583390720
        img.src = `${
     SVG_CONTENT_TYPE};utf-8,${
     encodeURIComponent(svg)}`;
      }
    });
  }

  /**
   * 1. https://xxx.svg
   * 2. http://xxx.svg
   * 3. //xxx.svg
   */
  public isOnlineLink = (src: string) => {
   
    return /^(https?:)?(\/\/)/.test(src);
  };

  private render() {
   
    const {
    name, fill } = this.cfg;
    const attrs = clone(this.cfg);
    const imageShapeAttrs: ShapeAttrs = {
   
      ...omit(attrs, 'fill'),
      type: GuiIcon.type,
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

100天精通Golang(基础入门篇)——第20天:Golang 接口 深度解析☞从基础到高级

&#x1f337;&#x1f341; 博主猫头虎&#x1f405;&#x1f43e; 带您进入 Golang 语言的新世界✨✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f…

FI 数据源(AP) 及 增量逻辑

AP 一般AP里要分析行项目数据&#xff0c;交易数据&#xff0c;历史付款信息。 还有一些供应商主数据。 基础的抽取数据源就是下面几个&#xff1a; 0FI_AP_4: Vendors: Line Items with Delta Extrcation0FI_AP_6: Vendor Sales Figures via Delta Extraction0FI_AP_7: Ve…

SQLPro Studio for Mac:强大的SQL开发和管理工具

SQLPro Studio for Mac是一款强大的Mac上使用的SQL开发和管理工具&#xff0c;它支持各种数据库&#xff0c;包括MySQL&#xff0c;PostgreSQL&#xff0c;SQLite等。使用 SQLPro Studio&#xff0c;您可以轻松地连接和管理您的数据库&#xff0c;执行SQL查询和脚本&#xff0c…

【python爬虫】8.温故而知新

文章目录 前言回顾前路代码实现体验代码功能拆解获取数据解析提取数据存储数据 程序实现与总结 前言 Hello又见面了&#xff01;上一关我们学习了爬虫数据的存储&#xff0c;并成功将QQ音乐周杰伦歌曲信息的数据存储进了csv文件和excel文件。 学到这里&#xff0c;说明你已经…

国标视频融合云平台EasyCVR视频汇聚平台关于远程控制的详细介绍

EasyCVR国标视频融合云平台是一个能在复杂网络环境下统一汇聚、整合和集中管理各类分散视频资源的平台。该平台提供了多种视频能力和服务&#xff0c;包括视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、集群、电子地图、H.265视频自动转码和智能分析等…

一种基于WinDump自动抓包实现方法

本发明的技术方案包括以下步骤和组件&#xff1a; 配置抓包参数&#xff1a;设置抓包的IP、端口以及过滤包大小等参数&#xff0c;以控制抓取的数据范围。循环自动抓包&#xff1a;利用WinDump工具实现循环自动抓包功能&#xff0c;类似于记录日志的方式保留抓包数据。当抓包数…

年收入超10亿美金?OpenAI 的“赚钱戏法”

点击关注 文丨郝鑫、刘雨琦&#xff0c;编丨刘雨琦 “我当时见到他不到三分钟&#xff0c;就在想&#xff0c;啊&#xff0c;19岁的比尔盖茨估计也就这样了吧&#xff01;” 在YC创始人Paul Graham&#xff08;格雷厄姆&#xff09;的眼里&#xff0c;28岁的Sam Altman与19…

香港服务器快还是台湾服务器快?

​  基于机房位置不同&#xff0c;香港服务器相对于台湾服务器在访问速度方面有一定的优势。香港服务器拥有CN2线路&#xff0c;因此访问速度较快。在网络服务商方面&#xff0c;中华电信等台湾服务商提供的带宽也具有很高的性价比。 香港服务器对大陆用户的影响 对于大陆用户…

如何将电子画册生成二维码,扫码查看产品图册?

随着移动互联网的发展&#xff0c;二维码已经成为了人们生活中不可或缺的一部分。无论是支付宝、微信支付的扫码支付&#xff0c;还是商家的促销活动、产品包装上的二维码&#xff0c;都展示了二维码的广泛应用。 电子画册也果不其然&#xff0c;它也可以生成二维码&#xff0c…

高德地图jsapi报错INVALID_USER_SCODE

看了各种网上方法&#xff0c;还是搞不定。无奈在高德开放平台提了工单。 很快高德的技术人员就给出了答复“您好&#xff0c;您检查一下您的安全密钥是否在key之前&#xff0c;安全密钥设置必须是在JS API 脚本加载之前进行设置&#xff0c;否则设置无效。” 并给出了推荐的…

使用 zipfile创建文件压缩工具

在本篇博客中&#xff0c;我们将使用 wxPython 模块创建一个简单的文件压缩工具。该工具具有图形用户界面&#xff08;GUI&#xff09;&#xff0c;可以选择源文件夹中的文件&#xff0c;将其压缩为 ZIP 文件&#xff0c;并将压缩文件保存到目标文件夹中。 C:\pythoncode\new\z…

如何提高工业网关的数据传输速度?

工业网关是工业物联网系统中不可或缺的设备&#xff0c;提高工业网关的数据采集、传输速度&#xff0c;是保障和优化物联网系统运营效率的基础。如何提高工业物联网关的数据传输速度&#xff1f;本篇就为大家简单介绍一下。 1、选用高品质网络设备 选用具有足够带宽容量的高质…

深圳发墨西哥专线要多久才能清关?

深圳发往墨西哥专线的货物清关时间会受到多种因素的影响&#xff0c;包括货物的性质、数量、海关政策、运输方式以及货物的文件准备等。下面将详细介绍这些因素对清关时间的影响。 1.货物的性质和数量是影响清关时间的重要因素之一。 一般来说&#xff0c;墨西哥专线中普通商品…

C语言_分支和循环语句(3)

文章目录 前言一、猜数字游戏1.1.电脑随机生成一个数&#xff08;1~100&#xff09;&#xff1b;1.2.猜数字&#xff1a;1.3.玩完一把不过瘾&#xff0c;可以继续玩&#xff0c;不用退出程序。1.4.rand 和 srand 之间的联系5.猜数字游戏源码 二、go to 语句2.1.例如&#xff1a…

PMP项目管理主要学习内容是什么?

PMP项目管理是指根据美国项目管理学会(Project Management Institute&#xff0c;简称PMI)制定的项目管理知识体系和方法论进行项目管理的一种认证。PMP主要关注项目的规划、执行和控制等方面的知识和技能。 下面是PMP项目管理《PMBOK指南》第六版的主要学习内容&#xff1a; …

RT-内核介绍

内核是一个操作系统的核心&#xff0c;是操作系统最基础也最重要的部分。它负责管理系统的线程、线程间通信、系统时钟、中断及内存等。 下图为 RT-Thread 内核架构图&#xff0c;内核部分包含内核库、实时内核实现。 内核库是为了保证内核能够独立运行的一套小型的类似C库的函…

新款岚图 FREE 26.69 万元,继续修高端操作

新款岚图 FREE 正式上市&#xff0c;新车共有一款车型&#xff0c;超长续航智驾版售价 26.69 万元。 在选装和上市权益方面&#xff0c;新款岚图 FREE 可选装百度 Apollo 高阶智驾选装包&#xff0c;价值 2.5 万元。 在 12 月 31 日前购买新款岚图 FREE &#xff0c;用户可以…

视频监控/视频汇聚/视频云存储EasyCVR平台接入华为ivs3800平台提示400报错,该如何解决?

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;视频云存储/安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频…

【高级程序设计语言C++】C++11

1. lambda表达式2. 移动构造函数和移动赋值运算符重载3. default关键字4. delete关键字5. 可变参数模板6. push_back和emplace_back的区别6.1. emplace_back的优势 7. 包装器7.1. 包装器的语法格式 1. lambda表达式 在C中&#xff0c;lambda表达式是一种用于创建匿名函数的语法…

发表于《自然》杂志:语音转文本BCI的新突破实现62字/分钟的速度

语音脑机接口&#xff08;BCI&#xff09;是一项创新技术&#xff0c;通过用户的大脑信号在用户和某些设备之间建立通信通道&#xff0c;它们在恢复残疾患者的言语和通信能力方面具有巨大潜力。 早期的研究虽然很有希望&#xff0c;但尚未达到足够高的精度来解码大脑活动&…