logo

S2

  • 使用文档
  • API 文档
  • 图表示例
  • 在线体验
  • 更新日志
  • 所有产品antv logo arrow
  • 2.x
  • 简介
  • 快速上手
  • 基础教程
    • 基本概念
      Updated
    • 表形态
      • 透视表
        Updated
      • 明细表
        Updated
    • 字段标记
      Updated
    • 小计总计
    • 排序
      • 基础排序
        Updated
      • 组内排序
        Updated
    • 主题配置
      Updated
    • Tooltip
      Updated
    • 数据格式化
      New
    • 多行文本
      New
    • 国际化
    • 分页
      New
  • 进阶教程
    • 单元格渲染类型
      • 链接
      • 图片
        New
      • 视频
        New
      • 迷你图表
      • 结合@antv/g2
      • 自定义渲染
    • 自定义
      • 自定义 Hook
        Updated
      • 自定义行列头分组
        New
      • 自定义 Icon
        Updated
      • 自定义单元格对齐方式
        Updated
      • 自定义单元格宽高
        Updated
      • 自定义排序操作
        Updated
      • 自定义折叠/展开节点
        New
    • 交互
      • 基础交互
        Updated
      • 自定义交互
      • 隐藏列头
        Updated
      • 行列宽高调整
        Updated
      • 合并单元格
      • 滚动
        Updated
      • 复制与导出
        New
      • 高亮/选中单元格
        New
    • 分析组件
      • 简介
        New
      • 高级排序
        Updated
      • 维度切换
        Updated
      • 导出
        Updated
      • 分页
        Updated
      • 维度下钻
        Updated
    • 表格组件
      • 编辑表
      • 趋势分析表
        Updated
    • 高清适配
      Updated
    • 获取表格实例
    • 表格自适应
    • 获取单元格数据
      Updated
    • 注册 AntV/G 插件
      New
    • 透视组合图
      Experimental
    • Vue 3.0 组件 (停止维护)
  • 扩展阅读
    • 数据流处理
      • 透视表
      • 明细表
    • 布局流程
      • 透视表
      • 明细表
    • 性能介绍
      Updated
  • 贡献指南
  • 常见问题
  • S2 2.0 升级指南

获取表格实例

上一篇
高清适配
下一篇
表格自适应

Resources

Ant Design
Galacea Effects
Umi-React 应用开发框架
Dumi-组件/文档研发工具
ahooks-React Hooks 库

社区

体验科技专栏
seeconfSEE Conf-蚂蚁体验科技大会

帮助

GitHub
StackOverflow

more products更多产品

Ant DesignAnt Design-企业级 UI 设计语言
yuque语雀-知识创作与分享工具
EggEgg-企业级 Node 开发框架
kitchenKitchen-Sketch 工具集
GalaceanGalacean-互动图形解决方案
xtech蚂蚁体验科技
© Copyright 2025 Ant Group Co., Ltd..备案号:京ICP备15032932号-38

Loading...

@antv/s2-react @antv/s2-vue

React 版本

对于使用 React 组件 SheetComponent 这一类场景,如果需要获取到 表格实例,进行一些进阶操作时,可以使用 React.useRef 和 onMounted 进行获取。

注意

表格是异步渲染,需要在 onMounted 后才能拿到最新的实例。

使用

import React from 'react'
import { SpreadSheet } from '@antv/s2'
import { SheetComponent } from '@antv/s2-react'
function App() {
const s2Ref = React.useRef<SpreadSheet>()
const onMounted = () => {
console.log(s2Ref.current)
}
return (
<SheetComponent ref={s2Ref} onMounted={onMounted}/>
)
}

搭配组件使用

如果需要搭配其他依赖 S2 实例的组件使用时,由于 Ref 不会触发组件重新渲染,可以使用 React.useState 保存实例,保证组件正常更新。查看示例

import React from 'react'
import { SpreadSheet } from '@antv/s2'
import { SheetComponent } from '@antv/s2-react'
import { Export } from '@antv/s2-react-components';
function App() {
const [sheetInstance, setSheetInstance] = React.useState<SpreadSheet>();
const onMounted = (s2: SpreadSheet) => {
setSheetInstance(s2);
};
return (
<>
<Export sheetInstance={sheetInstance} />
<SheetComponent onMounted={onMounted}/>
</>
)
}

组件形态变更时实例更新

S2 提供了 透视表, 明细表 等表形态,对于 SheetComponent 组件 对应 sheetType 属性

function App() {
// pivot: 透视表,table: 明细表
return (
<SheetComponent sheetType="pivot" />
)
}

当 sheetType 变更时,底层会使用不同的表格类进行渲染,也就意味着此时 实例 已经发生了变更.

pivot => table
+ new TableSheet()
- new PivotSheet()

变更前注册事件会被注销,S2 对这种场景进行了优化,不管是 ref 还是 onMounted 方式,拿到的都是最新的实例,开发者无需关心

import React from 'react'
import { SpreadSheet } from '@antv/s2'
import { SheetComponent } from '@antv/s2-react'
function App() {
const s2Ref = React.useRef<SpreadSheet>()
const [sheetType, setSheetType] = React.useState('pivot')
const onMounted = (instance) => {
console.log(s2Ref.current === instance)
}
React.useEffect(() => {
setSheetType('table')
},[])
return (
<SheetComponent ref={s2Ref} sheetType={sheetType} onMounted={onMounted}/>
)
}

转发实例给上层组件

如果你的业务对于 SheetComponent 进行了二次封装,需要暴露实例时,可以使用 React.forwardRef 进行实例转发。

const YourComponent = React.forwardRef(
(props, ref: React.MutableRefObject<SpreadSheet>) => {
// ... 业务逻辑
return (
<SheetComponent ref={ref} />
)
}
)
function App() {
const s2Ref = React.useRef<SpreadSheet>()
const onMounted = () => {
console.log(s2Ref.current)
}
return (
<YourComponent ref={s2Ref} onMounted={onMounted}/>
)
}

Vue 版本

使用

ref 方式得到的是一个对象,其中的 instance 属性才对应真正的表格实例:

<script lang="ts">
import type { S2DataConfig, S2Options } from '@antv/s2';
import { Sheet } from '@antv/s2-vue';
import { defineComponent, onMounted, shallowRef } from 'vue';
export default defineComponent({
setup() {
const s2 = shallowRef();
onMounted(() => {
console.log('s2 instance:', s2.value?.instance);
});
return {
s2
};
},
components: {
Sheet,
},
});
</script>
<template>
<SheetComponent ref="s2" :dataCfg="your-dataCfg" :options="your-options" />
</template>

转发实例给上层组件

如果你的业务对于 Sheet 进行了二次封装,需要暴露实例时,可以使用库提供的 useExpose 进行实例转发

// 二次封装组件
export default defineComponent({
name: 'YourSheet',
props: [] as unknown as BaseSheetInitProps,
emits: [] as unknown as BaseSheetInitEmits,
setup(props, ctx) {
const s2Ref = useExpose(ctx.expose);
return { s2Ref };
},
components: {
BaseSheet,
},
});
</script>
<template>
<SheetComponent ref="s2Ref" />
</template>

外部组件获取实例搭配使用 ref 方式:

<script lang="ts">
export default defineComponent({
setup() {
const s2 = shallowRef();
onMounted(() => {
console.log('s2 instance:', s2.value?.instance);
});
return {
s2
};
},
components: {
Sheet,
},
});
</script>
<template>
<YourSheet ref="s2" :dataCfg="your-dataCfg" :options="your-options" />
</template>