Spec 和 API

G2 推荐使用 Spec:通过 JavaScript 对象描述数据、编码、样式和视图结构,再调用 chart.options(spec) 提交配置。链式 API 则通过属性设置和节点创建构建相同的视图树,两者使用同一套渲染流程。

Spec 便于复制、组合和查看完整配置;理解两者的对应关系有助于阅读和迁移已有 API 代码。Spec 可以包含函数访问器和回调,不限于 JSON,直接使用 JSON.stringify 会丢失函数值。

两种写法

推荐的 Spec 写法:

import { Chart } from '@antv/g2';

const chart = new Chart({ container: 'container' });
const data = [
  { genre: 'Sports', sold: 275 },
  { genre: 'Strategy', sold: 115 },
];

chart.options({
  type: 'interval',
  data,
  encode: { x: 'genre', y: 'sold', color: 'genre' },
  transform: [{ type: 'sortX', by: 'y', reverse: true }],
  labels: [{ text: 'sold', position: 'top' }],
  tooltip: { items: ['sold'] },
  style: { radiusTopLeft: 4, radiusTopRight: 4 },
});
chart.render();

对应的链式 API 写法如下。保留上面的初始化和数据,用这段替换 chart.options(...)chart.render()

chart
  .interval()
  .data(data)
  .encode('x', 'genre')
  .encode('y', 'sold')
  .encode('color', 'genre')
  .transform({ type: 'sortX', by: 'y', reverse: true })
  .label({ text: 'sold', position: 'top' })
  .tooltip({ items: ['sold'] })
  .style('radiusTopLeft', 4)
  .style('radiusTopRight', 4);
chart.render();

属性映射

下表中的 node 表示同一个标记或复合节点。

Spec 链式 API 转换规则
{ type: 'interval' } parent.interval() 创建子节点,返回值是新节点。
{ encode: { x: 'year', y: 'value' } } node.encode('x', 'year').encode('y', 'value') 同类映射合并;重复键以最后一次设置为准。
{ axis: { x: false } } node.axis('x', false) 保留通道级配置,不能改成整个 axis: false
{ style: { fill: 'red' } } node.style({ fill: 'red' }) 传整个对象会替换该属性;逐键设置则更新键值。
{ interaction: { tooltip: true } } node.interaction('tooltip') 对象属性的单字符串参数表示该键为 true
{ transform: [a, b] } node.transform(a).transform(b) 单项调用追加,数组调用替换;必须保留顺序。
{ labels: [a, b] } node.label(a).label(b) Spec 使用复数 labels,API 使用单数 label
{ tooltip: { items: ['value'] } } node.tooltip(['value']) 数组转换为 items;单个字段或回调追加到 items
{ tooltip: false } node.tooltip(false) falsenull 不要改成空对象或空数组。
{ padding: 20 } node.attr('padding', 20) 没有专用 setter 的属性使用 attr

datatitle 等单值属性直接对应同名方法;scaleaxislegendstatetheme 等对象属性与 style 一样,区分逐键设置和整体替换。

层级与组合

单个标记直接使用 type: 'interval' 等标记类型,不需要额外包装 view。视图样式放在 viewStyle,标记样式放在 style;多个标记共享视图时,才使用 type: 'view'children

children 中的每个节点对应父节点上的一次创建调用,转换时应保留配置层级和节点顺序。chart.spaceFlex() 等根级复合调用对应 Spec 的根类型 spaceFlex,不要再套一层 view

Spec 可以通过对象展开、工厂函数和 map 复用配置,无需保留 API 的 .call(configure)。循环生成多个标记时,先收集完整的 children,再提交配置;逐次提交单个子节点会替换前面的结果。

更新与运行时操作

修改 Spec 后,需要重新提交并渲染:

const spec = {
  type: 'interval',
  data,
  encode: { x: 'genre', y: 'sold' },
};
chart.options(spec);
chart.render();

async function update(nextData) {
  spec.data = nextData;
  chart.options(spec);
  await chart.render();
}

chart.options() 读取当前配置,chart.options(spec) 提交配置,chart.render() 执行渲染。提交时会合并属性并重建提供的子树,不等于清空所有旧配置;事件回调应避免持有已被替换的旧标记节点。

容器、渲染器和插件仍在 new Chart(...) 中配置;事件监听、查询和销毁等运行时操作继续使用 Chart API。

全站搜索
文档与示例输入关键词开始搜索

输入关键词,查找文档、API 与示例

选择打开Esc关闭