--- title: 升级到 5.0 order: 6 --- 本文档将引导你从 G6 `4.x` 版本升级到 `5.x` 版本。如果你使用的是 `3.x` 版本,请先升级到 `4.x` 版本。 ## 升级前准备 1. 请确保当前 git 分支是干净的,没有未提交的代码。 2. 参考 [安装](/manual/getting-started/installation) 文档安装 `5.x` 版本,并移除 `4.x` 版本依赖。 ## 开始升级 ### 数据 新版本的数据格式有所变化,具体如下: 1. `nodes` `edges` `combos` 中所有样式属性都需要放在 `style` 中,`data` 中存放数据属性: ```typescript // 4.x const data = { nodes: [ { id: 'node1', label: 'node1', size: 20 }, { id: 'node2', label: 'node2', size: 20 }, ], edges: [{ source: 'node1', target: 'node2' }], }; // 5.x const data = { nodes: [ // label 为非样式属性,放在 data 中,可在样式映射函数中访问 // size 为样式属性,放在 style 中 { id: 'node1', data: { label: 'node1' }, style: { size: 20 } }, { id: 'node2', data: { label: 'node2' }, style: { size: 20 } }, ], edges: [{ source: 'node1', target: 'node2' }], }; ``` 由于我们重新设计实现了元素,新的元素配置项请参考相应文档进行修改: - [Node](/manual/element/node/overview) - [Edge](/manual/element/edge/overview) - [Combo](/manual/element/combo/overview) 2. 如果要在数据中指定元素类型,可以使用 `type` 属性: ```typescript { nodes: [ // 指定节点类型为 rect { id: 'node1', type: 'rect' }, ]; } ``` ### 配置项 变更 **fitView / fitCenter / fitViewPadding** - `fitView` 和 `fitCenter` 配置项已经合并为 `autoFit` - 若要使用 `fitView`,可以配置为 `autoFit: 'view'` - 若要使用 `fitCenter`,可以配置为 `autoFit: 'center'` - 也可以传入对象进行完整配置: ```js autoFit: { type: 'view', options: { // ... } } ``` - `fitViewPadding` 已变更为 `padding` 移除 **linkCenter** 5.x 的边连接机制会按照如下顺序依次尝试连接到节点/Combo: 1. 连接桩 2. 轮廓 3. 中心 移除 **groupByTypes** 移除 **autoPaint** 请手动调用 `render` 或 `draw` 方法进行绘制。 变更 **modes** 5.x 已经移除交互模式,你可以通过设置 `behaviors` 来切换当前启用的交互行为。 ```typescript // 4.x { modes: { default: ['drag-canvas', 'zoom-canvas'], preview: ['drag-canvas'], }, } graph.setMode('preview'); ``` ```typescript // 5.x { behaviors: ['drag-canvas', 'zoom-canvas'], } graph.setBehaviors(['drag-canvas']); ``` 变更 **defaultNode / defaultEdge / defaultCombo** 元素样式已移至 `[element].style` 中,如 `defaultNode` 变更为 `node.style`: ```typescript // 4.x { defaultNode: { size: 20, fill: 'red', } } // 5.x { node: { style: { size: 20, fill: 'red', } } } ``` 变更 **nodeStateStyles / edgeStateStyles / comboStateStyle** 元素状态样式已移至 `[element].state` 中,如 `nodeStateStyles` 变更为 `node.stateStyles`: ```typescript // 4.x { nodeStateStyles: { selected: { fill: 'red', } } } // 5.x { node: { state: { selected: { fill: 'red', } } } } ``` 变更 **animate / animateCfg** - `animate` 配置项已变更为 `animation` - `animate` 和 `animateCfg` 已合并为 `animation` ```typescript // 4.x { animate: true, } // 5.x { animation: true, } { animation: { duration: 500, easing: 'easeLinear', } } ``` 变更 **minZoom / maxZoom** `minZoom` 和 `maxZoom` 已合并为 `zoomRange` ```typescript // 4.x { minZoom: 0.5, maxZoom: 2, } // 5.x { zoomRange: [0.5, 2], } ``` 变更 **renderer** G6 5.x 支持多层画布,默认使用 `canvas` 渲染。 renderer 不再支持字符串类型,变更为回调函数: ```typescript // 4.x var options = { renderer: 'svg', }; // 5.x import { Renderer } from '@antv/g-svg'; { renderer: () => new Renderer(), } ``` 移除 **enabledStack / maxStep** 5.x 已移除内置撤销重做功能,相关能力请使用插件实现。 ### API 变更 **data / save / read / changeData** 5.x 提供了全新的数据 API,详见 [数据 API](/api/data)。 - 4.x `data` `changeData` 方法使用 5.x `setData` 替代 - 4.x `save` 方法使用 5.x `getData` 替代 - 4.x `read` 方法使用 5.x `setData` + `render` 替代 变更 **get / set** 若要访问 Graph options,请使用 `getOptions` 或者 `getXxx` API,例如 `getZoomRange` `getBehaviors` 等。 `set` 同理。 变更 **getContainer** 暂不支持直接获取容器的 API,但可以通过 `graph.getCanvas().getContainer()` 获取。 > 绝大部分情况下,你都不需要直接操作容器。 移除 **getGroup** 变更 **getMinZoom / getMaxZoom** 使用 `getZoomRange` 获取。 变更 **setMinZoom / setMaxZoom** 使用 `setZoomRange` 方法设置。 变更 **getWidth / getHeight** 使用 `getSize` 获取。 变更 **changeSize** 使用 `setSize` 设置。 变更 **zoom** 变更为 `zoomBy`。 变更 **translate** 变更为 `translateBy`。 变更 **moveTo** 变更为 `translateTo`。 变更 **focusItem** 变更为 `focusElement`。 移除 **addItem / updateItem / removeItem** 通过 `addData` / `updateData` / `removeData` 方法操作数据来添加或删除元素。 移除 **refreshItem** 移除 **refreshPositions** 移除 **updateCombo** 移除 **updateCombos** 移除 **updateComboTree** 变更 **node / edge / combo** 使用 `setNode` / `setEdge` / `setCombo` 方法替代。 变更 **showItem / hideItem** 使用 `setElementVisibility` 方法替代。 移除 **getNodes / getEdges / getCombos / getComboChildren /getNeighbors /find /findById / findAll /findAllByState** 5.x 不支持直接获取元素实例。 - 若要获取元素数据,使用 `getData` `getNodeData` `getEdgeData` `getComboData` 方法,支持传入元素 id 进行查找。 - 获取子节点数据,使用 `getChildrenData` 方法。 - 获取邻居节点数据,使用 `getNeighborNodesData` 方法。 - 基于状态查找元素数据,使用 `getElementDataByState`。 变更 **collapseCombo / expandCombo** 使用 `collapseElement` / `expandElement` 方法替代。 移除 **collapseExpandCombo** 移除 **createCombo** 通过 `addData` / `addComboData` 方法添加 Combo。 移除 **uncombo** 通过 `removeData` / `removeComboData` 方法移除 Combo。 变更 **setItemState** 使用 `setElementState` 方法替代。 移除 **clearItemStates** - 清除单个元素所有状态:`graph.setElementState(id, [])` - 清除多个元素所有状态:`graph.setElementState({ id1: [], id2: [] })` 移除 **priorityState** `setElementState` 时状态数组中靠后的状态优先级更高。 移除 **setMode** 使用 `setBehaviors` 来设置当前交互。 移除 **setCurrentMode** 变更 **layout** 不支持参数,如需配置布局,请使用 `setLayout`。 变更 **updateLayout** 变更为 `setLayout`。 移除 **destroyLayout** 变更 **addBehaviors / removeBehaviors** 使用 `setBehaviors` 替代。 移除 **createHull / getHulls / removeHull / removeHulls** - 多个 `Hull` 需在 `plugins` 中配置多个 `hull` 插件,如: ```typescript { plugins: ['hull', 'hull'], }; ``` - `Hull` 的获取、更新、移除操作通过 `setPlugins`, `updatePlugin` 实现。 暂未提供 **getNodeDegree** 暂未提供 **getShortestPathMatrix** 暂未提供 **getAdjMatrix** 移除 **pushStack / getUndoStack / getRedoStack / getStackData / clearStack** 所有撤销重做相关 API 请获取到对应插件后调用 API,例: ```typescript // 'history' 为使用插件时配置的 key const history = graph.getPluginInstance('history'); history.redo(); ``` 移除 **positionsAnimate / stopAnimate / isAnimating** 动画相关信息通过事件抛出: - 动画开始事件:`beforeanimate` - 动画结束事件:`afteranimate` - 停止动画: ```typescript graph.on('beforeanimate', (event) => { event.animation.stop(); }); ``` 变更 **getPointByClient / getClientByPoint / getPointByCanvas / getCanvasByPoint / getGraphCenterPoint / getViewPortCenterPoint** G6 5.x 采用了与 4.x 不同的坐标系,详见 [坐标系](/manual/further-reading/coordinate)。 移除 **setTextWaterMarker / setImageWaterMarker** 要使用水印功能,请参考 [水印](/manual/plugin/watermark)插件。 变更 **toFullDataURL** 使用 `toDataURL` 替代,指定参数为:`mode: 'overall'` ```typescript graph.toDataURL({ mode: 'overall' }); ``` 移除 **downloadFullImage / downloadImage** 仅提供导出为 `DataURL` 的能力,如需下载图片,请参考如下实例代码: ```typescript async function downloadImage() { const dataURL = await graph.toDataURL(); const [head, content] = dataURL.split(','); const contentType = head.match(/:(.*?);/)![1]; const bstr = atob(content); let length = bstr.length; const u8arr = new Uint8Array(length); while (length--) { u8arr[length] = bstr.charCodeAt(length); } const blob = new Blob([u8arr], { type: contentType }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'graph.png'; a.click(); } ``` 移除 **clear** 使用 `setData` + `draw` 清空数据和画布。 ### 扩展注册 与 G6 4.x 不同,G6 5.x 使用的统一的扩展注册函数(register),你可以参考 [注册扩展](/manual/graph/extension#注册扩展) 来注册 G6 扩展。 下列 G6 4.x 的注册函数已经废除: - registerNode - registerEdge - registerCombo - registerLayout - registerBehavior ### 事件 与 G6 4.x 相比,G6 5.x 的事件但存下如下差异: - 移除了 `mouse` 和 `touch` 事件,统一使用 `pointer` 事件 - 生命周期事件名命名格式通常为: `before/after` + `对象/属性` + `操作`,例如:`beforeelementcreate` 表示在创建元素前触发 - 下列事件已被移除: - afteractivaterelations - afteradditem - aftercreateedge - aftergraphrefresh - aftergraphrefreshposition - afteritemrefresh - aftermodechange - afterremoveitem - afterupdateitem - beforeadditem - beforecreateedge - beforegraphrefresh - beforegraphrefreshposition - beforeitemrefresh - beforemodechange - beforeremoveitem - beforeupdateitem - dragnodeend - nodeselectchange - stackchange - tooltipchange - 下列元素变更事件被移除,但你仍可通过 `beforeelementupdate` 和 `afterelementupdate` 获取: - afteritemstatechange - afteritemstatesclear - afteritemvisibilitychange - beforeitemstatechange - beforeitemstatesclear - beforeitemvisibilitychange - 下列事件有所变更: - graphstatechange 事件变更为 beforeelementstatechange / afterelementstatechange - viewportchange 事件变更为 beforetransform / aftertransform 完整的事件列表请参考 [事件](/api/event)。