使用jsplumb绘图,实现连线

近期有个需求,实现节点之间的连线,选用的jsplumb来绘制。

我自己在实现过程中,遇到了重绘问题/加载顺序问题/自动刷新过程中保持连线正确等很多问题,查了好多资料后,得以解决,有问题的小伙伴可以一起交流。

jsplumb涉及的几个重要网址,可以作为研发过程中的依据:

 jsplumb官网:https://jsplumbtoolkit.com

 jsplumb中文(这个中文网站列出的API还是比较完善的):https://github.com/wangduanduan/jsplumb-chinese-tutorialhttps://wdd.js.org/jsplumb-chinese-tutorial/#/

jsPlumb是一个比较强大的绘图组件,它提供了一种方法,主要用于连接网页上的元素。在现代浏览器中,它使用SVG或者Canvas技术,而对于IE8以下(含IE8)的古董浏览器,则使用VML技术。

就该库而言,我认为有一个很重要的点,即视图与数据结构同步。jsplumb并不维护数据结构,数据结构需要自己去维护,如果页面发生改变,jsplumb会通过事件通知你。你通过事件去改变你的数据。

 

需要特别注意的一点是,jsplumb是操作dom进行运行的,必须要等dom全部加载完之后在进行渲染jsPlumb。vue开发的话,可以写在this.$nextTick方法里。流程图更新时,会重新获取dom的id。

同时需要注意:当数据改变时,流程图也要跟着改变,所以要清除之前的连接线,然后重新绘制。

清除连线调用reset方法:

let plumbIns = jsPlumb.getInstance();
plumbIns.reset();

使用该组件库最基本的配置如下代码:

private connectEle(relations) {
    // 定义默认配置
    const defaultConfig = {
      // 默认从左右选取最优锚点
      anchor: ['Left', 'Right'],
      // 连线为直线,间隙为10
      connector: ['Straight', { gap: 10 }],
      // 端点为空
      endpoint: 'Blank',
      // 设定线条样式
      paintStyle: { stroke: '#cdf1f1', strokeWidth: 2 },
      Container: 'monitor-chart-container',
    };
    this.plumbIns.ready(() => {
      relations.forEach(ele => {
        defaultConfig.paintStyle = ele.reachable
          ? { stroke: '#cdf1f1', strokeWidth: 2 }
          : { stroke: '#aaaaaa', strokeWidth: 1 };
        this.plumbIns.connect(
          {
            source: ele.source,
            target: ele.target,
          },
          defaultConfig,
        );
      });
    });
  }

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
实现连线的方法有很多种,以下是一种基于 HTML5 Canvas 和 jQuery 的实现方式: 1. 在 HTML 中添加两个 Canvas 标签,一个用于绘制节点,一个用于绘制连线。 2. 使用 jQuery 将节点拖拽到 Canvas 上,并在节点上添加事件监听器,记录节点的位置信息。 3. 在连线 Canvas 上使用 JavaScript 绘制连线,根据节点位置信息计算连线起点和终点的坐标。 4. 如果需要实现动态连线,可以在节点上添加事件监听器,在节点拖拽时实时更新连线位置。 下面是一个简单的示例代码,仅供参考: HTML 代码: ``` <canvas id="node-canvas"></canvas> <canvas id="line-canvas"></canvas> ``` JavaScript 代码: ``` var nodeCanvas = document.getElementById("node-canvas"); var lineCanvas = document.getElementById("line-canvas"); var nodeCtx = nodeCanvas.getContext("2d"); var lineCtx = lineCanvas.getContext("2d"); var nodes = []; // 保存节点信息的数组 // 监听节点的mousedown事件,记录节点位置信息 $("#node-canvas").on("mousedown", function(e) { var offsetX = e.offsetX; var offsetY = e.offsetY; var newNode = { x: offsetX, y: offsetY }; nodes.push(newNode); }); // 监听节点的mouseup事件,绘制连线 $("#node-canvas").on("mouseup", function(e) { var offsetX = e.offsetX; var offsetY = e.offsetY; var lastNode = nodes[nodes.length - 1]; lineCtx.beginPath(); lineCtx.moveTo(lastNode.x, lastNode.y); lineCtx.lineTo(offsetX, offsetY); lineCtx.stroke(); }); // 监听节点的drag事件,实时更新连线位置 $("#node-canvas").on("drag", function(e) { var offsetX = e.offsetX; var offsetY = e.offsetY; var lastNode = nodes[nodes.length - 1]; lineCtx.clearRect(0, 0, lineCanvas.width, lineCanvas.height); lineCtx.beginPath(); lineCtx.moveTo(lastNode.x, lastNode.y); lineCtx.lineTo(offsetX, offsetY); lineCtx.stroke(); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Delicia_Lani

你的鼓励将是我写作的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值