antv/g6之交互模式mode

什么是mode

在 AntV G6 中,"mode" 是用于配置图表交互模式的一种属性。通过设置 "mode",可以控制图表的行为,以满足不同的交互需求。可能在不同的场景需要展现的交互行为不一样。比如查看模式下点击一个点就选中的状态,在编辑的情况下点击点可以出现编辑框,在创建边的情况下点击点就是创建一个边的起点。mode正是管理这些behavior的一种机制,一个图上可以存在多种交互模式,每个交互模式的behavior不一样。

配置 mode

在 AntV G6 中配置不同的 "mode" 可以通过在图表实例的配置中指定 "modes" 参数来实现。以下是一个示例,演示如何配置不同的 "mode":

javascript 复制代码
const graph = new G6.Graph({
  container: 'your-container', // 指定容器
  width: 800, // 指定宽度
  height: 600, // 指定高度
  modes: {
    default: ['drag-node', 'zoom-canvas', 'drag-canvas'], // 默认模式下启用的交互模式
    addEdge: ['create-edge', 'zoom-canvas', 'drag-canvas'], // 建模式
    edit: ['click-select'], // 编辑模式
  },
  // 其他配置...
});

在上述示例中,创建了一个名为 "graph" 的 G6 图表实例,并在 "modes" 参数中配置了不同的模式。可以根据需要在不同的模式下启用或禁用不同的交互操作。每个模式的值是一个包含可用的交互模式的数组。

如何切换

  1. 使用 graph.setMode(modeName) 方法 :可以通过调用 setMode 方法来切换图表的模式。传递模式的名称作为参数,这将启用相应的交互模式。例如:
javascript 复制代码
// 切换到默认模式
graph.setMode('default');

// 切换到编辑模式
graph.setMode('edit');

// 切换到建边模式
graph.setMode('addEdge');

可以根据用户的需求和操作来动态切换不同的模式,以提供不同的图表交互体验。

编辑已有的mode

g6也提供了removeBehaviors、addBehaviors、updateBehavior api来编辑mode,可以删除、添加、或修改某个mode中的交互行为。

javascript 复制代码
// 向 default 模式中添加名为 drag-canvas 的行为,并使用行为的默认配置
graph.addBehaviors('drag-canvas', 'default');

// 从 default 模式中移除名为 drag-canvas 的行为
graph.removeBehaviors('drag-canvas', 'default');

// 向 edit 模式中添加名为 drag-canvas 的行为,并定义个性化配置
graph.addBehaviors(
  {
    type: 'drag-canvas',
    direction: 'x',
  },
  'edit',
);

// 更新 'edit' 模式下的 behavior 'click-select'
graph.updateBehavior('click-select', { trigger: 'ctrl' }, 'edit');

示例

定义了三个模式,然后根据按钮点击切换不同的模式

  1. 默认模式下,可以拖拽图、拖拽点、缩放图。
  2. 编辑模式下就有个点击选中的效果。
  3. 创建边的模式,点击两个点创建新边。

代码如下:

javascript 复制代码
import React, { useEffect, useRef } from "react";
import G6 from "@antv/g6";
import { Button } from "antd";


const TestModes: React.FC<any> = (props: any) => {
    const containerRef = useRef<HTMLDivElement>(null);
    const graphRef = useRef<any>();

    useEffect(() => {
        initDraw();
    }, []);

    const initDraw = () => {
        graphRef.current = new G6.Graph({
            linkCenter: true,
            container: containerRef.current || "",
            height: 800,
            width: 800,
            modes: {
                default: ['drag-node', 'zoom-canvas', 'drag-canvas'], // 默认模式下启用的交互模式
                addEdge: ['create-edge', 'zoom-canvas', 'drag-canvas'], // 建模式
                edit: ['click-select'], // 编辑模式
            },
            defaultNode: {
                size: 20,
                style: {
                    fill: "#C6E5FF",
                    stroke: "#5B8FF9",
                    lineWidth: 0.3,
                },
                labelCfg: {
                    style: {
                        fontSize: 12,
                    },
                    position: "bottom",
                    offset: 1,
                },
            },
            defaultEdge: {
                style: {
                    lineWidth: 2,
                    color: "#000",
                    labelCfg: {
                        autoRotate: true,
                        refY: 5,
                        style: {
                            fill: "#000",
                        },
                    },
                    endArrow: {
                        fill: "#000",
                        path: G6.Arrow.triangle(10, 12, 25),
                        d: 25,
                    },
                },
            },
            nodeStateStyles: {
                // The node styles in selected state
                selected: {
                    stroke: '#666',
                    lineWidth: 2,
                    fill: 'steelblue',
                },
            }
        });

        const data = {
            nodes: [
                { id: "node1", x: 100, y: 100, label: "Node 1" },
                { id: "node2", x: 300, y: 100, label: "Node 2" },
                { id: "node3", x: 200, y: 200, label: "Node 3" },
            ],
            edges: [{ source: "node1", target: "node2", label: "Edge 1" }],
        };

        // 渲染图表
        graphRef.current.data(data);
        graphRef.current.render();

        graphRef.current.on('nodeselectchange', (e: any) => {
            // 当前操作的 item
            console.log(e.target);
            // 当前操作后,所有被选中的 items 集合
            console.log(e.selectedItems);
            // 当前操作时选中(true)还是取消选中(false)
            console.log(e.select);
        });
    };

    return (
        <>
            <div>
                <Button onClick={() => { graphRef.current.setMode('default') }}>默认模式</Button>
                <Button onClick={() => { graphRef.current.setMode('edit') }}>编辑模式</Button>
                <Button onClick={() => { graphRef.current.setMode('addEdge') }}>创建边</Button>
            </div>
            <div
                className="ModalgraphContainer"
                ref={containerRef}
                id="graphContainer"
            />
        </>
    );
};
export default TestModes;

效果如下:

相关推荐
m0_471199636 分钟前
【小程序】订单数据缓存 以及针对海量库存数据的 懒加载+数据分片 的具体实现方式
前端·vue.js·小程序
编程大师哥7 分钟前
Java web
java·开发语言·前端
A小码哥8 分钟前
Vibe Coding 提示词优化的四个实战策略
前端
Murrays8 分钟前
【React】01 初识 React
前端·javascript·react.js
大喜xi12 分钟前
ReactNative 使用百分比宽度时,aspectRatio 在某些情况下无法正确推断出高度,导致图片高度为 0,从而无法显示
前端
helloCat12 分钟前
你的前端代码应该怎么写
前端·javascript·架构
电商API_1800790524713 分钟前
大麦网API实战指南:关键字搜索与详情数据获取全解析
java·大数据·前端·人工智能·spring·网络爬虫
康一夏14 分钟前
CSS盒模型(Box Model) 原理
前端·css
web前端12314 分钟前
React Hooks 介绍与实践要点
前端·react.js
我是小疯子6615 分钟前
JavaScriptWebAPI核心操作全解析
前端