Skip to content
Discussion options

You must be logged in to vote

@vuturn
在 S2 中直接嵌入 React/Vue 等框架组件(即 DOM 节点)会带来较大的性能开销,尤其是在滚动场景下。S2 的核心渲染引擎是基于 Canvas 的 G 渲染引擎。

要实现通过 Ant Design 样式的组件(如 Tag、Button)来丰富表格内容,同时保持高性能,最佳实践是使用 G 的绘图语法来模拟这些组件的外观和交互

核心原理

S2 提供了强大的自定义单元格机制 (customCell)。你可以在单元格内部,使用 G 提供的图形(Rect, Text, Circle 等)组合绘制出类似 Tag 或 Button 的样式。

为什么不直接用 DOM?

S2 是基于 Canvas 的,而在 Canvas 上覆盖大量的 DOM 节点(每个单元格一个)会导致:

  1. 滚动性能下降:DOM 的重排重绘开销远大于 Canvas 绘制。
  2. 层级同步问题:Canvas 画布与 DOM 层级需要精确同步,处理复杂。

成本提示

虽然使用 G 语法可以完美复刻 UI 并保持极致性能,但也存在一定的开发成本

  1. 绘制成本:你需要手动计算坐标、宽高、圆角、文字居中等布局属性(即手动实现类似 CSS 的盒模型)。
  2. 交互成本:Canvas 内部的图形没有浏览器原生的事件冒泡机制,虽然 G 提供了事件系统,但实现复杂的交互(如 Hover 变色、点击反馈)需要手动通过事件监听来改变图形属性。

实现示例 (Pseudo Code)

参考 antvis/S2#3247

以下是一个简单的思路,展示如何用 G 绘制一个 "Tag":

import { Group, Rect, Text

Replies: 3 comments 2 replies

Comment options

You must be logged in to vote
1 reply
@vuturn
Comment options

Comment options

You must be logged in to vote
0 replies
Comment options

You must be logged in to vote
1 reply
@vuturn
Comment options

Answer selected by vuturn
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
None yet
3 participants