Loading...
在提出问题前,请确保你已经仔细阅读了一遍文档,查看了相关图表示例,并且已经查看了常见问题和 Issues。
@antv/s2-react
和 @antv/s2-vue
见官方 React JavaScript 环境要求 和 Vite 浏览器兼容性
查看示例:
我们提供了 dist
目录的 UMD
编译文件,引入 dist/s2.min.js
, 可访问全局变量 window.S2
<script src="./dist/s2.min.js"></script><script>async function bootstrap() {const s2 = new S2.PivotSheet(container, s2DataConfig, s2Options);await s2.render();}bootstrap();</script>
所有的导出统一挂载在全局变量 window.S2
下
<script type="module">- import { S2Event, PivotSheet, TableSheet } from '@antv/s2'+ const { S2Event, PivotSheet, TableSheet } = S2</script>
如果使用的是 React
版本 @antv/s2-react
, 或者 Vue3
版本 @antv/s2-vue
还需额外引入样式文件
<link rel="stylesheet" href="./dist/s2-react.min.css"/><link rel="stylesheet" href="./dist/s2-vue.min.css"/>
也可以直接使用 CDN
(推荐), 比如 UNPKG 或者
<script src="https://unpkg.com/@antv/s2/dist/s2.min.js"></script>// React 需额外引入样式:<link rel="stylesheet" href="https://unpkg.com/@antv/s2-react/dist/s2-react.min.css"/>// Vue3 版本 需额外引入样式:<link rel="stylesheet" href="https://unpkg.com/@antv/s2-vue/dist/s2-vue.min.css"/>
原国内镜像 https://antv-s2.gitee.io 和 旧版官网 https://s2.antv.vision 不再维护,请访问新版官网 https://s2.antv.antgroup.com 速度更快。
官网右上角可以切换文档版本:
transform: scale
后,图表鼠标坐标响应不正确可以开启 AntV/G 渲染引起的 supportsCSSTransform
属性
const s2Options = {transformCanvasConfig() {return {supportsCSSTransform: true}}}
也可以手动调用 s2.changeSheetSize
根据缩放比改变图表大小,使图表和父元素缩放比保持一致
const scale = 0.8s2.changeSheetSize(width * scale, height * scale)await s2.render(false)
可参考 issue #808 #990 (感谢 @cylnet @xiaochong44)
const pivotSheet = new PivotSheet(document.getElementById('container'), dataCfg, options);
更新 options: 可选项,会与上次的数据进行合并
pivotSheet.setOptions({ ... })await pivotSheet.render(false) // 重新渲染,不更新数据
重置 options: 可选项,直接使用传入的 option,不会与上次的数据进行合并
pivotSheet.setOptions({ ... }, true)await pivotSheet.render(false) // 重新渲染,不更新数据
更新 dataCfg: 可选项,会与上次的数据进行合并
pivotSheet.setDataCfg({ ... })await pivotSheet.render(true) // 重新渲染,且更新数据
重置 dataCfg: 可选项,直接使用传入的 dataCfg,不会与上次的数据进行合并
pivotSheet.setDataCfg({ ... }, true)await pivotSheet.render(true) // 重新渲染,且更新数据
更新 theme: 可选项
pivotSheet.setThemeCfg({ ... })await pivotSheet.render(false) // 重新渲染,不更新数据
图表需要挂载在 dom
节点上,请确保该节点存在
<div id="container"></div>
const pivotSheet = new PivotSheet(document.getElementById('container'), dataCfg, options);
如果传入的是选择器,S2 会使用 document.querySelector()
去查找,也就意味着,只要节点存在,且选择器符合 querySelector
的语法,都是可以的
const pivotSheet = new PivotSheet('#container', dataCfg, options);const pivotSheet = new PivotSheet('.container', dataCfg, options);const pivotSheet = new PivotSheet('#container > div', dataCfg, options);const pivotSheet = new PivotSheet('#container > div[title="xx"]', dataCfg, options);
表格不感知变化,需要更新完配置后调用一次 render
方法触发更新
s2.changeSheetSize(200, 200)await s2.render(false)
可以,请查看 这篇文章
@antv/s2
中不显示,在 @antv/s2-react
@antv/s2-vue
中可以正常显示?请查看 Tooltip 注意事项
@antv/s2
中使用 tooltip ?请查看 Tooltip 文档 和 示例
请查看相关文档和示例
当手动调用实例方法 s2.showTooltip
时,如果内容是一个 React 自定义组件,且组件内容未更新时,可以尝试声明 forceRender
强制更新组件内容
s2.showTooltip({content: <YourComponent props={"A"}/>})s2.showTooltip({content: <YourComponent props={"B"} />options: {forceRender: true}})
相关 issue: https://github.com/antvis/S2/issues/1716
<SheetComponent options={options} dataCfg={dataCfg}/>
场景 1
: 当组件重新渲染,或者配置项更新后,组件会 更新 S2 底表的配置, 会触发 隐藏 Tooltip 的逻辑, 请检查并尽量避免你的上层组件更新
, 或者配置项的引用被改变
所导致的 SheetComponent
无意义的重渲染。
场景 2
: S2 默认点击非表格区域,会隐藏 tooltip, 还原交互状态,请确保你自己的业务逻辑有无相应的 click
事件,看是否有被冒泡影响,尝试阻止冒泡
event.stopPropagation()
场景 3
: 手动调用 s2.showTooltip
展示 tooltip 后,点击内部的某个元素后,再次展示第二个 tooltip, 这个时候 tooltip 被隐藏,和场景 2 类似,请给 click
事件增加冒泡处理。// 菜单 1-1 => clicks2.showTooltip({ ... })// 菜单 1-1 => clickevent.stopPropagation()s2.showTooltip({ ... })
可直接使用 S2 的 Vue3 版本 @antv/s2-vue
, 或查看 在 Vue3 中自定义
Excel
吗?请检查 Excel
的编码设置是否正确
请检查 Excel
的分隔符设置是否正确
按住 Shift
键的同时滚动鼠标
边框属于 聚焦 (hoverFocus)
交互状态的一种,可通过 主题配置 - 交互通用主题 关闭。
s2.setTheme({dataCell: {cell: {interactionState: {hoverFocus: {// 边框设置为透明borderColor: 'transparent'// 或者边框透明度设置为 0// borderOpacity: 0}}}}})
目前只有 React 版本 @antv/s2-react
支持编辑表格,其他版本暂不支持,需参考 源码 自行实现
AntV/G
渲染引擎的插件/初始化参数?import { Plugin as PluginA11y } from '@antv/g-plugin-a11y';const s2Options = {transformCanvasConfig(renderer) {// 修改配置renderer.setConfig({enableCulling: true,enableDirtyCheck: true,});// 注册插件renderer.registerPlugin(new PluginA11y({enableExtractingText: true,}),);console.log('当前已注册插件:', renderer.getPlugins(), renderer.getConfig());// 透传 G 的初始化参数:https://g.antv.antgroup.com/api/canvas/optionsreturn {devicePixelRatio: 2,dblClickSpeed: 500,cursor: 'crosshair',};},}
表格内部监听 G
的 rightup/rightdown
事件,而不是 <canvas/>
DOM 的 contextmenu
事件,因此默认行为并不是弹出右键系统菜单,所以 event.preventDefault()
无效:
// ❌ 无效写法s2.on(S2Event.GLOBAL_CONTEXT_MENU, (event) => {event.preventDefault();})// ✅ 正确写法s2.getCanvasElement().addEventListener('contextmenu', (event) => {event.preventDefault();});
customSVGIcons
注册自定义图标,在字段标记中使用,无法修改颜色?在线链接
不支持修改颜色,推荐使用 本地文件
或者 字符串
.
+ import Icon from '/path/to/icon.svg'const s2Options = {customSVGIcons: [{name: 'CustomIcon',// 1. 字符串(支持自定义颜色)+ src: `<?xml version="1.0" encoding="UTF-8"?><svg t="1634603945212" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="558" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200" fill="currentColor"><defs><style type="text/css"></style></defs><path d="M605.61 884.79h-24.26c-21.34 0-38.66 17.32-38.66 38.66 0 21.34 17.32 38.66 38.66 38.66h24.26c21.34 0 38.66-17.32 38.66-38.66 0-21.35-17.32-38.66-38.66-38.66z" fill="#040000" p-id="559"></path><path d="M950.47 419.76c-22.17-15.48-51.17-16.01-73.92-1.33L715.7 522.53 573.09 223.42c-10.95-22.98-33.55-37.43-58.97-37.75h-0.85c-25.09 0-47.67 13.84-59.05 36.29L302.25 521.82 154.9 419.61c-22-15.18-50.71-15.73-73.27-1.46-22.53 14.32-34.23 40.57-29.8 66.9l70.9 421.76c5.33 32.04 32.82 55.3 65.31 55.3h272.43c21.34 0 38.66-17.32 38.66-38.66 0-21.34-17.32-38.66-38.66-38.66H197.44l-64.99-386.62 136.17 94.46a66.14 66.14 0 0 0 54.01 9.79 66.097 66.097 0 0 0 42.81-34.28l147.54-291.11 138.35 290.2c8.21 17.19 23.41 30.03 41.76 35.19 18.37 5.24 38 2.21 53.99-8.1l148.62-96.17-87.74 386.65h-60.1c-21.34 0-38.66 17.32-38.66 38.66 0 21.34 17.32 38.66 38.66 38.66h68.96c31.16 0 57.71-21.22 64.58-51.57l95.72-421.86c5.97-26.39-4.47-53.42-26.65-68.93zM514.74 151.68c28.08 0 50.85-22.76 50.85-50.85s-22.77-50.85-50.85-50.85c-28.09 0-50.85 22.76-50.85 50.85s22.77 50.85 50.85 50.85zM973.15 277.37c-28.08 0-50.85 22.77-50.85 50.85 0 28.09 22.76 50.85 50.85 50.85 28.08 0 50.85-22.76 50.85-50.85 0-28.08-22.77-50.85-50.85-50.85zM101.69 328.22c0-28.08-22.76-50.85-50.85-50.85S0 300.14 0 328.22c0 28.09 22.76 50.85 50.85 50.85s50.84-22.77 50.84-50.85z" fill="#040000" p-id="560"></path></svg>`,// 2. 本地文件(支持自定义颜色,本质上也是字符串)+ src: Icon,// 3. 在线链接(不支持自定义颜色)- src: 'https://gw.alipayobjects.com/zos/bmw-prod/f44eb1f5-7cea-45df-875e-76e825a6e0ab.svg',},],conditions: {icon: [{field: 'number',mapping(fieldValue, data) {return {icon: 'CustomIcon',+ fill: '#30BF78',};},}],}}
import { Image as GImage } from '@antv/g';class CustomColCell extends ColCell {drawBackgroundShape() {new GImage({style: {x: 200,y: 100,width: 200,height: 200,src: 'https://gw.alipayobjects.com/zos/antfincdn/og1XQOMyyj/1e3a8de1-3b42-405d-9f82-f92cb1c10413.png',},})}}
const ImageCache = new Map<string, HTMLImageElement>();class CustomColCell extends ColCell {drawBackgroundShape() {const url = 'https://gw.alipayobjects.com/zos/antfincdn/og1XQOMyyj/1e3a8de1-3b42-405d-9f82-f92cb1c10413.png'const imgCache = ImageCache.get(url)if (imgCache) {this.appendChild(new GImage({style: {x: 200,y: 100,width: imgCache.width,height: imgCache.height,src: imgCache},}))return;}const img = new Image();img.src = urlimg.crossOrigin = 'Anonymous';img.onload = () => {// 图片加载成功后创建this.appendChild(new GImage({style: {x: 200,y: 100,width: img.width,height: img.height,src: img},}))};}}
请查看 自定义特定单元格 示例。
Vue
或者 Angular
版本吗?如何获取新版本发布通知?创建 S2
表格有三种方式,基础类版本 @antv/s2
和 基于 @antv/s2
封装的 React
和 Vue3
版本:
@antv/s2
: 基于 Canvas
和 AntV/G 6.0 开发,提供基本的表格展示/交互等能力。版本依赖:无
@antv/s2-react
: 基于 React 18
, 和 @antv/s2
封装,兼容 React 16/17
版本,同时提供配套的 分析组件 (@antv/s2-react-components
).版本依赖:
"peerDependencies": {"@antv/s2": "^2.0.0","react": ">=16.9.0","react-dom": ">=16.9.0"}
@antv/s2-vue
: 基于 Vue3
, @antv/s2
, [email protected]
封装。停止维护版本依赖:
"peerDependencies": {"@antv/s2": "^2.0.0","ant-design-vue": "^3.2.0","vue": ">=3.x"}
也就是说 @antv/s2
和框架无关,无任何额外依赖, 你可以在 Vue
, Angular
等任意框架中使用。
包名 | 稳定版 | 包大小 | 下载量 |
---|---|---|---|
@antv/s2 | |||
@antv/s2-react | |||
@antv/s2-react-components | |||
@antv/s2-vue(停止维护) |
Watch
S2 代码仓库, 选择 Custom - Releases
来获取消息推送。配套的 分析组件,目前还没有 @antv/s2-angular
的开发计划,欢迎社区一起建设 👏🏻.
请查看 贡献指南
目前 S2
只支持 web
平台,小程序暂不支持。
请阅读 提 Issue 前必读, 并严格按照 Issue 模板
填写,提供一些有意义的信息,包括但不限于:
避免
latest
,next
或者*
这种没有实际意义的版本号,提供你实际使用的版本可以帮助我们更快的定位问题,有可能你使用的功能在新版本中才支持,或者 bug 在新版本中已经被修复了
并不是每个人都了解你这段文字对应的上下文,提供完整的复现步骤,贴上报错截图,gif, 请不要惜字如金
推荐使用 官方 codesandbox 模板 搭建一些最小的可复现 demo
code
标签不要贴一大段没格式化过的业务代码,请提供 s2Options s2DataConfig 之类的配置文件,合理的使用
markdown
语法,节约大家的时间
预期是 "没问题", 目前是 "有问题", 这种描述和没说没什么区别,请尽量的描述的具体一点,如:
数据不正确:预期应该是 xx, 实际是 xx. 布局错误:节点应该显示在行头,实际出现在了列头。
在提出问题前,请确保你已经阅读过 官方文档 和 常见问题, 并且已经搜索查阅过相关 Issues 列表.
强烈建议阅读:
✅ 一个很好的示例:#852
❌ 一个不好的示例:#1057
推荐使用 codesandbox
, 我们提供了各种版本的模板,方便你反馈问题。查看所有模板
@antv/s2/extends
找不到,报 This Dependency was not found
错误// package.json{"exports": {".": {"import": "./esm/index.js","require": "./lib/index.js"},"./extends": {"import": "./esm/extends/index.js","require": "./lib/extends/index.js"},"./*": "./*"},"main": "lib/index.js","module": "esm/index.js",}
通常来说,是你的使用的包管理器或者打包工具,不支持 exports
字段,识别不了 @antv/s2/extends
这个子模块,请参考 #3008
Can't resolve './@antv/s2/esm/styles/variables.less'
低版本的打包工具如果不写 "~", 即: @import '~@antv/s2/esm/styles/variables.less'
的话,会识别成本地模块,自动转成相对路径,而不是从 node_modules 去找,导致源码被编译成如下,导致文件找不到。
- @import '@antv/s2/esm/styles/variables.less';+ @import './@antv/s2/esm/styles/variables.less';
解决方案:
@antv/s2
转成 node_modules/@antv/s2
。{loader: 'less-loader',options: {lessOptions: {paths: [path.resolve(__dirname, 'node_modules')],javascriptEnabled: true,},},}alias: {'@antv/s2': path.resolve(__dirname, 'node_modules/@antv/s2')}
请参考 3008#issuecomment-2537747353 或 3008#issuecomment-2586200238 的解决方案。