antv/g6之交互模式mode

什么是mode

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

配置 mode

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

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 方法来切换图表的模式。传递模式的名称作为参数,这将启用相应的交互模式。例如:
// 切换到默认模式
graph.setMode('default');

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

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

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

编辑已有的mode

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

// 向 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. 创建边的模式,点击两个点创建新边。

代码如下:

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;

效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/117295.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化:折线图

1.初看效果 &#xff08;1&#xff09;效果一 &#xff08;2&#xff09;数据来源 2.JSON数据格式 其实JSON数据在JAVA后期的学习过程中我已经是很了解了&#xff0c;基本上后端服务器和前端交互数据大多是采用JSON字符串的形式 &#xff08;1&#xff09;JSON的作用 &#…

本地idea远程调试服务器程序

本文主要介绍idea本地调试远程服务器程序的方式。相信很多同行跟我一样&#xff0c;在最初接触公司项目的时候&#xff0c;遇到测试提出的缺陷&#xff0c;往往会在本地进行调试、替换jar包远程调试等方式&#xff0c;本地调试往往会导致数据和环境不一致的问题使得问题无法复现…

没想到这么齐全!这份 Python 实战干货yyds

今天我分享一些Python学习神器资料&#xff0c;有需要的小伙文末自行免费领取。 1.200Python练手案例&#xff1a; 2.Python全套视频教程等&#xff1a; 3.浙大Python学习套装&#xff1a; * 4.Python实战案例&#xff1a; 5.Pandas学习大礼包 6.学习手册大礼包 Python知识…

CSAPP BOMB LAB part3

CSAPP BOMB LAB part3 phase_4 bomb.s phase_4的代码: 格式: 40102e行&#xff0c;比较0x8rsp的值和0xe, 需要让0x8rsp小于0xe, 然后跳转到40103a, func函数根据bomb.s 转化为c代码&#xff1a; 这个直接参考了知乎网友的翻译&#xff0c; func4的返回值等于0, 跳转到40…

分治法——找众数

分治法——找众数 要求&#xff1a; 寻找整数数组的众数&#xff0c;如果存在多个众数&#xff0c;则返回权值最小的那个 第一步&#xff1a; 要利用分治法找众数&#xff0c;首先就先要使数组有序。这里&#xff0c;我们用C语言库中的qsort进行快排&#xff1a; qsort(nums…

3D高斯泼溅(Splatting)简明教程

在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D场景编辑器 3D 高斯泼溅&#xff08;Splatting&#xff09;是用于实时辐射场渲染的 3D 高斯分布描述的一种光栅化技术&#xff0c;它允许实时渲染从小图像样…

直流无刷电机(BLDC)六步换相驱动

直流无刷电机&#xff08;BLDC&#xff09;六步换相驱动 文章目录 直流无刷电机&#xff08;BLDC&#xff09;六步换相驱动1. 前言2. 六步换相原理3. 电角度与机械角度4. 动手实践4.1 霍尔输出表测量4.2 换向控制4.3 代码编写 5. 总结 1. 前言 直流无刷电机相对直流有刷电机具…

Redis之Java操作Redis的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Redis实战开发》。&#x1f3af;&#x1f3af; …

Android java Handler sendMessage使用Parcelable传递实例化对象,我这里传递Bitmap 图片数据

一、Bundle给我们提供了一个putParcelable(key,value)的方法。专门用于传递实例化对象。 二、我这里传递Bitmap 图片数据&#xff0c;实际使用可以成功传统图像数据。 发送&#xff1a;Bundle bundle new Bundle();bundle.putParcelable("bitmap",bitmap);msg.setD…

【GitLab CI/CD、SpringBoot、Docker】GitLab CI/CD 部署SpringBoot应用,部署方式Docker

介绍 本文件主要介绍如何将SpringBoot应用使用Docker方式部署&#xff0c;并用Gitlab CI/CD进行构建和部署。 环境准备 已安装Gitlab仓库已安装Gitlab Runner&#xff0c;并已注册到Gitlab和已实现基础的CI/CD使用创建Docker Hub仓库&#xff0c;教程中使用的是阿里云的Docker…

【漏洞复现】Apache_Tomcat7+ 弱口令 后台getshell漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 说明内容漏洞编号漏洞名称Tomcat7 弱口令 && 后台getshell漏洞漏洞评级高…

【Java】Beanshell下通过java操作Excel(xlsx格式)文件读写

一、概述 在项目开发中往往需要使用到Excel的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后使用POI写到Excel上。 操作Excel目前比较流行的就是Apache POI和阿里巴巴的easyExcel ! Excel文件处理的主流技术包括: Apache POI 、 JXL 、 Alibaba Ea…

机器学习---SVM目标函数求解,SMO算法

1. 线性可分支持向量机 1.1 定义输入数据 假设给定⼀个特征空间上的训练集为&#xff1a; 其中&#xff0c;(x , y )称为样本点。 x 为第i个实例&#xff08;样本&#xff09;。 y 为x 的标记&#xff1a; 当y 1时&#xff0c;x 为正例&#xff1b;当y −1时&#xff0c;x…

16. 机器学习 - 决策树

Hi&#xff0c;你好。我是茶桁。 在上一节课讲SVM之后&#xff0c;再给大家将一个新的分类模型「决策树」。我们直接开始正题。 决策树 我们从一个例子开始&#xff0c;来看下面这张图&#xff1a; 假设我们的x1 ~ x4是特征&#xff0c;y是最终的决定&#xff0c;打比方说是…

合肥中科深谷嵌入式项目实战——人工智能与机械臂(六)

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

Python最强自动化神器Playwright!再也不用为爬虫逆向担忧了!

版权说明:本文禁止抄袭、转载,侵权必究! 目录 一、简介+使用场景二、环境部署(准备)三、代码生成器(优势)四、元素定位器(核心)五、追踪查看器(辅助)六、权限控制与认证(高级)七、其他重要功能(进阶)八、作者Info一、简介+使用场景 Playwright是什么?来自Chat…

0001Java安卓程序设计-基于Android多餐厅点餐桌号后厨前台服务设计与开发

文章目录 **摘** **要****目** **录**系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘 要 移动互联网时代的到来&#xff0c;给人们的生活带来了许多便捷和乐趣。随着用户的不断增多&#xff0c;其规模越来越大&#…

linux环境下编译,安卓平台使用的luajit库

一、下载luajit源码 1、linux下直接下载&#xff1a; a、使用curl下载&#xff1a;https://luajit.org/download/LuaJIT-2.1.0-beta3.tar.gz b、git下载地址&#xff1b;https://github.com/LuaJIT/LuaJIT.git 2、Windows下载好zip文件&#xff0c;下载地址&#xff1a;https…

【四、http】go的http的文件下载

一、日常下载图片到本地 //下载文件func downloadfile(url, filename string) {r, err : http.Get(url)if err ! nil {fmt.Println("err", err.Error())}defer r.Body.Close()f, err : os.Create(filename)if err ! nil {fmt.Println("err", err.Error())…

一文详解:传统企业如何把进销存管理流程搬到线上?

进销存管理是企业管理的核心流程之一&#xff0c;它有助于提高效率、降低成本、增加盈利&#xff0c;同时确保客户满意度&#xff0c;这对于企业的长期成功和竞争力至关重要。但在信息化转型的浪潮下&#xff0c;很多企业的传统进销存流程却遇到不少问题。 如果你也在考虑把进…