首页 > 其他分享 >六、使用jsPlumb实现流程图--Overlays使用

六、使用jsPlumb实现流程图--Overlays使用

时间:2024-03-25 11:44:48浏览次数:30  
标签:Overlay -- value Label jsPlumb location Overlays type

一、Overlay的功能
叠层(Overlay)可以是任意的DOM元素,用于叠加在Connection或Endpoint元素上--绝大部分都是用于叠加在线条上。jsPlumb把Overlay分为了五类:ArrowLabelPlainArrowDiamondCustom
除了CustomLabel类型,其他三类就是jsPlumb提供的可以直接使用的图形;Label类型可以直接提供字符串文案,jsPlumb就可以生成对应的Overlay并显示;而Custom类型就是自定义DOM。

二、Overlay的使用
创建Overlay有多种方式:
创建连线时创建Overlay

jsPlumb.value.connect({
    source: node1.value,
    target: node2.value,
    anchors: ['Right', 'Left'],
    connector: StraightConnector.type,
    overlays: [
      {
        type: 'Arrow',
        options: {
          location: 1,
        },
      },
      {
        type: 'PlainArrow',
        options: {
          location: 0.25,
        },
      },
      {
        type: 'Diamond',
        options: {
          location: 0.75,
          id: 'diamondOverlay'
        },
      },
      {
        type: 'Label',
        options: {
          label: 'myLabel',
          location: 0.5,
        },
      },
    ],
  });

其中的location属性就是设置Overlay在线条上位置。如果location在[0,1]之间,代表的就是长度比例,例如0.5=中间,0.25=起始点1/4处,0.75=目的点1/4处,1=目的点;如果location>1,就是到起始点的距离px。
属性id就是给Overlay一个全局唯一ID,后续可以通过这个ID查询到该Overlay,从而进行操作--删除/更新等。

另外就是在创建Endpoint的时候可以使用connectorOverlays参数来创建Overlay:

const endpoint3 = jsPlumb.value.addEndpoint(node3.value, {
    source: true,
    endpoint: 'Rectangle',
    anchor: AnchorLocations.Right,
    connectorOverlays: [
      { type: 'PlainArrow', options: { location: 1 } },
      { type: 'Label', options: { label: 'From Node3', id: 'node3-overlay' } },
    ],
  });
  const endpoint4 = jsPlumb.value.addEndpoint(node4.value, {
    target: true,
    endpoint: 'Dot',
    anchor: AnchorLocations.Left,
  });

但是这样配置的Overlay不是立刻创建并显示的,而是要等到以endpoint3为起始点进行连线的时候才会出来,也就是在连线的同时创建出Overlay。

并且如果把connectorOverlays配置到只能作为目的点的Endpoint的话是没用的。connectorOverlays只能在source=true时才会在连线时生效。
官方文档中说addEndpoint的参数中可以使用overlays来配置,实际使用中是不能使用overlays参数的,只有connectorOverlays可以使用。

还有就是jsPlumb的线条实例可以直接调用addOverlay来创建

  const conn_5_6 = jsPlumb.value.connect({
    source: node5.value,
    target: node6.value,
    anchors: ['Top', 'Top'],
    connector: 'Flowchart',
  });
  conn_5_6.addOverlay({
    type: 'PlainArrow',
    options: { location: 1 },
  });

三、Overlay的配置
各种类型的Overlay都有一个配置参数就是location,指定Overlay所处的位置。而PlainArrowDiamond都是一种Arrow,就是某一项参数--foldback的配置值不同而已。
Arrow有以下配置参数:

  • width:设置箭头的宽度
  • length:设置箭头的长度。结合width参数就可以用来设置箭头的大小。
  • location: 指定位置
  • direction: 指定箭头的方向,取值只能是1或-11代表向前(指向目的点), -1代表向后(指向起始点)。
  • foldback: 设置一个数值,用于控制箭头的形状。
    前四个参数的含义都很明确也很好理解,关于foldback参数,用图解释:

    图中的红色点,就是foldback指定的数值。Arrow类型foldback=0.623PlainArrow类型foldback=1Diamond类型foldback=2。其实本质就是一个四边形,三个点固定,第四个点可以沿着对角线移动,从而可以形成不同的形状。
    如果觉得jsPlumb提供的箭头不好看,就可以微调这个参数的值。因此PlainArrowDiamond出了foldback参数,其余可配参数与Arrow一致。

Label类型
Label类型的Overlay并不是图形,而是文案。因此配置项不同:

  • label:指定文案内容。
  • cssClass:配置Overlay样式。(官方文档中说建议使用labelStyle配置,但没有找到哪里可以使用labelStyle)
  • location:指定Overlay的位置。
  const conn_7_8 = jsPlumb.value.connect({
    source: node7.value,
    target: node8.value,
    connector: 'Flowchart',
    anchors: ['Top', 'Top'],
    overlays: [
      {
        type: 'Label',
        options: {
          location: 0.3,
          label: 'Label1',
          cssClass: 'label-e1',
          id: 'lab1',
        },
      },
      {
        type: 'Label',
        options: {
          location: 0.6,
          label: 'Label2',
          labelStyle: { color: 'blue' },
          id: 'lab2',
        },
      },
    ],
  });
  .label-e1 {
    color: red;
    padding: 4px;
    background-color: blue;
    height: 40px;
  }

官方文档中写的,通过Overlay实例可以调用setLabel()和getLabel()方法,在实际jsPlumb的overlay.d.ts源代码中,Overlay实例并没有提供这两个API。

由于在连线上创建Label是非常常用的,jsPlumb提供了更加简便的创建Label的方式:

  const conn_7_8_1 = jsPlumb.value.connect({
    source: node7.value,
    target: node8.value,
    connector: 'Flowchart',
    anchors: ['Bottom', 'Bottom'],
    label: 'label by connect',
  });

Custom
自定义Overlay,可以将Overlay设置成按钮/下拉框/输入框等任意元素。

import {
  newInstance,
  BrowserJsPlumbInstance,
  AnchorLocations,
  StraightConnector,
  Component,
} from '@jsplumb/browser-ui';

jsPlumb.value.connect({
    source: node9.value,
    target: node10.value,
    anchors: ['Top', 'Top'],
    connector: 'Flowchart',
    overlays: [
      { type: 'Arrow', options: { location: 1 } },
      {
        type: 'Custom',
        options: {
          create: (component: Component) => {
            console.log(component);
            const d = document.createElement('span');
            d.setAttribute('class', 'line-btn');
            d.addEventListener('click', (event: MouseEvent) => {
              event.stopPropagation();
              alert('btn click');
            });
            d.innerHTML = '按钮';
            return d;
          },
          location: 0.5,
        },
      },
    ],
  });
  .line-btn {
    color: white;
    background-color: #40bdec;
    font-size: 12px;
    border-radius: 4px;
    padding: 3px;
    cursor: pointer;
  }


配置项create为一个方法,方法最后需要返回一个DOM即可,不管是简单的还是复杂的。

四、Overlay的操作
除了Overlay的创建,还有一些其他的API操作,例如显示/隐藏移除。通过持有Overlay实例或Connection实例就可以调用这些方法:

  // 隐藏所有overlay
  conn_7_8.hideOverlays();
  // 显示所有overlay
  conn_7_8.showOverlays();

  // 通过线条实例来显示/隐藏overlay
  conn_7_8.hideOverlay("lab1");
  conn_7_8.showOverlay("lab1");

  // 通过overlay实例来显示/隐藏label
  const lab2Overlay = conn_7_8.getOverlay("lab2");
  lab2Overlay.setVisible(false);
  lab2Overlay.setVisible(true);

官方文档中写的Overlay实例有hide()和show()方法,实际代码中并没有这两个API

五、总结
文章中的完整演示代码地址在此,jsPlumb中的几个关键概念的基本使用方式就已经介绍完了,使用这些基本用法就可以创建一个简单的流程图功能,但是还不足以实际完成一个项目。接下来会介绍常用的事件与拦截器。

标签:Overlay,--,value,Label,jsPlumb,location,Overlays,type
From: https://www.cnblogs.com/bencakes/p/18091540

相关文章

  • 微信小程序使用echarts(三)
    一、新问题在根据前两个步骤完成小程序图表的显示之后,发现echarts过大,导致小程序超过2m二、解决过程1、根据官网上的提示进行图表定制,同时注意官网上的echarts.js版本和定制版本需要一致,以防出现版本原因导致的其他问题2、在定制完成,并且将定制的echarts.min.js替换掉原来的ec......
  • ElasticSearch8 - SpringBoot整合ElasticSearch
    前言springboot整合ES有两种方案,ES官方提供的ElasticsearchJavaAPIClient和spring提供的[SpringDataElasticsearch](SpringDataElasticsearch)两种方案各有优劣Spring:高度封装,用着舒服。缺点是更新不及时,有可能无法使用ES的新APIES官方:更新及时,灵活,缺点是......
  • drf : 自动生成路由,视图层自定义方法,路由映射方法,action参数。
    扩展一个知识点:在Django中,代码只要顶格编写,程序一运行,代码将直接执行。drf路由Routers自动生成路由需要继承ViewSetMixin子类,重写了as_view()方法。导入模块:fromrest_frameworkimportrouters创建router对象,并注册视图集合,例如:router=SimpleRouter()router.registe......
  • python 递归树状结构 和 排序
    排序defrecursive_sort(self,categories):categories.sort(key=lambdax:x['sort'])forcategoryincategories:ifcategory['children']:category['children']=self.recursive_sort(ca......
  • C#中DataGrid导出Excel文件
    privatevoidbtnExport_Click(objectsender,RoutedEventArgse){System.Diagnostics.Stopwatchsw=newSystem.Diagnostics.Stopwatch();sw.Start();grid.SelectAllCells();grid.ClipboardCopyMod......
  • EasyUi之Tabs(选项卡)
    原文链接:https://blog.csdn.net/qianbihua00/article/details/115392143什么是Tabs选项卡是最流行的导航模式之一(与菜单栏和垂直导航一样)。选项卡最大的优点是用户很熟悉,而且经常是持久的内容,所以即使用户在网站或应用程序中跳出刚浏览过的内容,他们也不会迷失。官方示例 ......
  • drf : 通用视图类和(GenericAPIView)5个视图扩展类,九个视图子类,视图集。
    视图RESTframework提供了众多的通用视图基类与扩展类,以简化视图的编写。APIViewrest_framework.views.APIViewAPIView是RESTframework提供的所有视图的基类,继承自Django的View父类。GenericAPIView使用[通用视图类]继承自APIVIew,主要增加了操作序列化器和数据库查询的方......
  • 14IP地址、主机名、域名
    IP地址每一台联网的电脑都会有一个地址,用于和其它计算机进行通讯IP地址主要有2个版本,V4版本和V6版本(V6很少用)IPv4版本的地址格式是:a.b.c.d,其中abcd表示0~255的数字,如192.168.88.101就是一个标准的IP地址可以通过命令:ifconfig,查看本机的ip地址如无法使用ifconfig命令,可以安装:y......
  • 2024第二届经济管理、贸易与信息技术创新国际会议(ICEMITI2024)
    2024第二届经济管理、贸易与信息技术创新国际会议(ICEMITI2024)会议简介2024第二届经济管理、贸易与信息技术创新国际会议(ICEMITI2024)将在中国郑州举行。这是一个重要的学术会议,旨在讨论当前经济管理、贸易和信息技术领域的热点问题,分享最新的研究成果,推动相关研究与应用的发......
  • kprobe
    原文地址:https://www.cnblogs.com/arnoldlu/p/9752061.htmlLinuxkprobe调试技术使用kprobe调试技术是为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术。利用kprobe技术,可以在内核绝大多数函数中动态插入探测点,收集调试状态所需信息而基本不影响原有执行流程。k......