vue LogicFlow自定义边实现示例详解

yizhihongxing

下面是对“vue LogicFlow自定义边实现示例详解”的完整攻略。

一、前言

Vue LogicFlow 是一个基于 Vue.js 的流程图库,它提供了许多丰富的功能和组件,例如节点、连线、锚点等。其中,连线是流程图中不可或缺的一个元素,Vue LogicFlow 可以自定义连线,本文将详细讲解如何实现自定义边。

二、实现自定义边

2.1 边类型定义

在 Vue LogicFlow 中,边的类型有默认的直线连线,而自定义边需要在连线类型定义中指定 {type: 'custom'},并指定渲染函数 render 和计算路径的函数 getPath,如下所示:

const customEdgeType = {
  type: 'custom',
  render(h, { model }) {
    return h('path', {
      attrs: {
        stroke: '#333',
        fill: 'none',
        'stroke-width': 2,
        d: model.path
      }
    })
  },
  getPath({ startPoint, endPoint }) {
    const hGap = Math.abs(endPoint.x - startPoint.x)

    const startPointCenter = {
      x: startPoint.x,
      y: startPoint.y + hGap / 2
    }

    const endPointCenter = {
      x: endPoint.x,
      y: endPoint.y - hGap / 2
    }

    return `M${startPoint.x},${startPoint.y} L${startPointCenter.x},${startPointCenter.y} L${endPointCenter.x},${endPointCenter.y} L${endPoint.x},${endPoint.y}`
  }
}

Vue.use(LogitFlow, {
  edgeTypes: [customEdgeType]
})

2.2 实现连线拖动和释放

在开始连线的时候,需要监听 Vue LogicFlow 触发的 edge:dragstart 事件和拖动结束的 edge:dragend 事件。在监听事件中,我们需要记录起始节点和终止节点 startNode、endNode 和其锚点的编号 startAnchor、endAnchor。具体实现如下:

// 记录起始边和终止边
let startNode
let endNode
let startAnchor
let endAnchor

// 监听连线拖动开始事件
lf.on('edge:dragstart', ({ data, x, y }) => {
  if (data.type !== 'custom') {
    return
  }

  const point = lf.clientToCanvas({ x, y })

  // 检测是否拖动到节点上面
  const node = lf.getIntersectElements(point, [NODE_TYPE])[0]

  if (!node) {
    return
  }

  startNode = node
  startAnchor = lf.getAnchorInfo(node, point)

  // 创建临时边
  const edge = lf.createEdge({
    type: 'custom'
  })

  // 设置临时边起始点
  edge.setEndpoint({ x: point.x, y: point.y })

  lf.add(edge)
})

// 监听连线拖动结束事件
lf.on('edge:dragend', ({ data, x, y }) => {
  if (data.type !== 'custom') {
    return
  }

  const point = lf.clientToCanvas({ x, y })

  // 检测是否拖动到节点上面
  const node = lf.getIntersectElements(point, [NODE_TYPE])[0]

  if (!node) {
    lf.remove(lf.edges[l.focusedEdgeIndex])
    return
  }

  endNode = node
  endAnchor = lf.getAnchorInfo(node, point)

  // 更新临时边
  const edge = lf.edges[lf.focusedEdgeIndex]

  edge.setEndpoint(endAnchor)

  // 如果起始节点和结束节点相同,则删除连线
  if (startNode === endNode) {
    lf.remove(edge)
    return
  }

  // 连接起始节点和结束节点
  edge.setModel({
    sourceNodeId: startNode.id,
    sourceNodeAnchor: startAnchor.anchorIndex,
    targetNodeId: endNode.id,
    targetNodeAnchor: endAnchor.anchorIndex
  })

  lf.emit('custom-edge:add', edge.getModel())
})

2.3 创建自定义连线组件

为了方便使用自定义连线,在 Vue LogicFlow 中创建自定义连线组件,组件需要绑定双向数据,传入连线的类型、路径和起始节点信息等。组件代码如下:

Vue.component('CustomEdge', {
  props: {
    model: Object,
    selected: Boolean,
    hover: Boolean,
    edgeType: String,
    ...
  },
  computed() {
    path() {
      return this.model.path
    }
  },
  ...
});

2.4 使用示例

最后,我们使用一个具体的示例,说明如何完成 Vue LogicFlow 自定义边的实现。

下面是一个示例,其中 lf 是 Vue LogicFlow 实例:

lf.addNode({/* node info */})
lf.addNode({/* node info */})
lf.addNode({/* node info */})
lf.addNode({/* node info */})

lf.on('custom-edge:add', ({ sourceNodeId, targetNodeId, sourceNodeAnchor, targetNodeAnchor }) => {
  console.log(`连线:${sourceNodeId}(${sourceNodeAnchor}) -> ${targetNodeId}(${targetNodeAnchor})`)
})

以上就是 Vue LogicFlow 自定义边实现的详细攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue LogicFlow自定义边实现示例详解 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • golang 接口嵌套实现复用的操作

    Golang 接口嵌套实现复用的操作攻略 在Golang中,接口嵌套是一种强大的技术,可以实现代码的复用和灵活性。通过接口嵌套,我们可以将多个接口组合在一起,形成一个新的接口,从而实现更高层次的抽象和复用。下面是详细的攻略,包括两个示例说明。 1. 定义接口 首先,我们需要定义一些接口,这些接口将被嵌套在其他接口中。接口定义使用type关键字,后面跟着int…

    other 2023年7月28日
    00
  • 关于angular浏览器兼容性问题的解决方案

    关于Angular浏览器兼容性问题的解决方案,可以采取以下步骤: 步骤一:使用polyfills 在Angular项目中,如果使用了Web APIs,比如IntersectionObserver、ResizeObserver,以及一些ECMAScript特性比如Promise、fetch,那么部分用户使用的浏览器可能不支持这些API和特性。 解决这个问题,可…

    other 2023年6月26日
    00
  • Win10 19H1跳跃预览版怎么升级到18262版?

    Win10 19H1 是指Windows 10的2019年第一季度更新版本,是微软公司发布的Windows 10版本。现在我们需要升级到18262版。 以下是完整的升级步骤: 步骤一:备份重要文件 在升级之前,我们需要备份我们的重要文件。如此一来,一旦升级出现问题,你可以使用备份的数据还原电脑。 步骤二:检查计算机配置 在升级之前,我们需要检查我们的计算机是…

    other 2023年6月27日
    00
  • ES6 class类实现继承实例详解

    ES6 class类实现继承实例详解 在JavaScript中,类继承是一种基本的面向对象编程技巧。ES6引入了类和继承机制,使得JavaScript编写类和继承的方式更加直观和简单。 ES6类声明 ES6类通过class关键字声明,在类中定义一个构造函数,使用new关键字来实例化: class Animal { constructor(name, age)…

    other 2023年6月26日
    00
  • gomap

    以下是GoMap的完整攻略: 1. 下载和安装GoMap 首先,我们需要从GoMap的官方网站下载GoMap。可以在以下链接中下载: GoMap – OpenStreetMap mapping tool 选择适合您操作系统的版本进行下载。下载完成后,按照提示进行安装。 2. 启动GoMap 启动GoMap后,您将看到一个地图界面。您可以使用鼠标和键盘控制地图…

    other 2023年5月8日
    00
  • 大势至软件政府机关网络安全管理、上网行为管理解决方案,全面保护政府机关网络安全

    大势至软件政府机关网络安全管理、上网行为管理解决方案 简介 大势至软件是一套专业的政府机关网络安全管理、上网行为管理解决方案,适用于政府机关、事业单位等公共管理机构。通过大势至软件,政府机关可以全面保护网络安全,规范上网行为,实现网络信息安全管理。下面将详细讲解大势至软件的完整攻略。 步骤 步骤一:安装大势至软件 政府机关首先需要根据实际需求,购买大势至软件…

    other 2023年6月26日
    00
  • 手机信号不好怎么办(多种解决方法)

    手机信号不好怎么办(多种解决方法) 手机信号不好可能会影响我们正常的通话、短信发送和网络使用,因此让我们不得不思考如何解决。下面是一些常见的方法,可以帮助我们提高手机信号的质量。 方法一:更换运营商 更换运营商是解决手机信号问题的最直接和有效的方法之一。因为不同的运营商在地区覆盖和信号强弱上存在很大的差异。可以通过以下几种方式来了解不同运营商在所在地区的信号…

    other 2023年6月27日
    00
  • 运行时实现Java的多态性

    介绍运行时实现Java的多态性的攻略如下: 什么是Java的多态性 Java的多态性是指对象在运行期间可以展现出不同的行为。这是Java中的一大特征,它使得程序更加灵活、可扩展和可维护。 Java允许两种形式的多态性:编译时多态和运行时多态。编译时多态是方法重载,运行时多态是方法覆盖(也叫方法重写)。 实现Java的多态性的攻略 要实现Java的多态性,需要…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部