JavaScript is required

GraphInstance API

图实例 API 参考指南

全面展示 relation-graph 的核心实例方法,包括数据加载、节点展开/折叠、视图控制、缩放和事件处理,是进行高级图操作的基础。

功能概述

此示例演示了 relation-graph 的核心实例 API 使用方法。通过 RGHooks.useGraphInstance() 获取图实例后,可以调用各种方法来控制图的行为,包括加载数据、节点展开/折叠、移动视图、缩放等。这是使用 relation-graph 进行高级操作的基础。

核心特性实现

使用 Hooks 获取图实例

3.x 版本推荐使用 Hooks API 获取图实例:

const graphInstance = RGHooks.useGraphInstance();

这比传统的 ref 方式更符合 React 最佳实践,可以直接在组件中使用实例方法。

数据加载和初始化

使用 setJsonData 方法加载图数据:

const myJsonData: RGJsonData = {
    rootId: 'a',
    nodes: [/* 节点数组 */],
    lines: [/* 线条数组 */].map((line, index) => ({ ...line, id: `line-${index}` }))
};

await graphInstance.setJsonData(myJsonData);
graphInstance.moveToCenter();
graphInstance.zoomToFit();

注意:线条必须有 id 属性,可以通过 map 为每条线生成唯一 ID。

节点展开/折叠 API

通过实例方法控制节点的展开和折叠状态:

const callApi = () => {
    const targetNodeId = 'b';
    const targetNode = graphInstance.getNodeById(targetNodeId);
    if (targetNode) {
        if (targetNode.expanded === true) {
            graphInstance.collapseNode(targetNode);
        } else {
            graphInstance.expandNode(targetNode);
        }
    }
};

getNodeById 可以获取特定节点的引用,expandNodecollapseNode 控制其状态。

视图控制 API

控制图的可视区域和缩放级别:

graphInstance.moveToCenter();  // 将图移动到视图中心
graphInstance.zoomToFit();     // 缩放以适应视图

这些方法确保用户可以看到完整的图内容。

事件处理

处理节点和线条的点击事件:

const onNodeClick = (nodeItem: any, e: RGUserEvent) => {
    console.log('onNodeClick:', nodeItem.text);
};

<RelationGraph
    options={graphOptions}
    onNodeClick={onNodeClick}
/>

事件处理器接收节点对象和用户事件对象,可以用于实现交互功能。

配置选项

定义图的布局和行为选项:

const graphOptions: RGOptions = {
    layout: {
        layoutName: 'tree',
        from: 'left',
        treeNodeGapH: 120,
        treeNodeGapV: 10
    },
    defaultNodeShape: RGNodeShape.rect,
    defaultNodeWidth: 100,
    defaultNodeHeight: 30,
    defaultLineShape: RGLineShape.StandardCurve,
    defaultJunctionPoint: RGJunctionPoint.lr,
    reLayoutWhenExpandedOrCollapsed: true,
    defaultExpandHolderPosition: 'right'
};

这些选项控制图的默认行为和外观。

创意使用场景

动态数据加载

从后端 API 获取数据后动态更新图:

const fetchData = async () => {
    const response = await fetch('/api/graph-data');
    const data = await response.json();
    await graphInstance.setJsonData(data);
    graphInstance.moveToCenter();
};

搜索和导航

实现搜索功能,定位并高亮特定节点:

const searchNode = (nodeId: string) => {
    const node = graphInstance.getNodeById(nodeId);
    if (node) {
        graphInstance.focusOnNode(node);
        graphInstance.setSelectedNodes([node]);
    }
};

批量操作

对多个节点执行批量操作:

const expandAllNodes = () => {
    const nodes = graphInstance.getNodes();
    nodes.forEach(node => {
        if (!node.expanded) {
            graphInstance.expandNode(node);
        }
    });
};

导出功能

将图的当前状态导出为数据或图像:

const exportGraph = async () => {
    const data = graphInstance.getJsonData();
    const blob = await graphInstance.getDataImage();
    // 导出数据或图像
};

动画和过渡

创建自定义动画效果:

const animateToNode = async (nodeId: string) => {
    const node = graphInstance.getNodeById(nodeId);
    if (node) {
        await graphInstance.animateToCenter(node);
        await graphInstance.animateZoom(1.5);
    }
};

状态保存和恢复

保存和恢复图的状态:

const saveState = () => {
    const state = {
        data: graphInstance.getJsonData(),
        view: graphInstance.getViewPosition(),
        zoom: graphInstance.getZoom()
    };
    localStorage.setItem('graphState', JSON.stringify(state));
};