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

下面是对“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日

相关文章

  • java解析url的链接和参数

    以下是“Java解析URL链接和参数”的完整攻略: Java解析URL链接和参数 在Java中,您可以使用java.net.URL类解析URL链接和参数。以下是如使用Java解URL链接和参数的步骤: 1. 创建URL对象 要解析URL链接和参数首先需要创建一个URL对象。例如,以下如创建一个URL对象的代码: URL url = new URL(&quot…

    other 2023年5月7日
    00
  • 无效的源发行版:11和无效的目标发行版:11解决方法

    当在Ubuntu系统中使用apt-get命令安装软件包时,有时会遇到“无效的源发行版:11”或“无效的目标发行版:11”等错误。这些错误通常是由于软件源配置不正确或系统版本不兼容导致的。在攻略中,我们将介绍如何解决这些错误。 无效的源发行版11 如果您在使用apt-get命令时遇“无效的源发行版:11”错误,可以按照以下步骤解决: 打开终端并输入以下命令: …

    other 2023年5月9日
    00
  • 删除win10更新后的z盘符(已验证)

    删除Win10更新后的Z盘符(已验证) 最近,一些用户在更新Windows 10后发现,新的系统分配了一个Z盘符,并且无法删除。这是因为在新的更新版本中,Microsoft修改了默认的磁盘分区方式,从而导致了这一问题。在这篇文章中,我们将为您详细介绍如何删除Win10更新后的Z盘符。 步骤一:打开磁盘管理器 首先,我们需要打开Windows磁盘管理器。可以通…

    其他 2023年3月28日
    00
  • 使用CA和CCA克隆账户与检查账号是否被克隆工具的方法

    使用CA和CCA克隆账户与检查账号是否被克隆工具的方法 使用克隆账户的攻击可以使攻击者获取受害者账户中的敏感信息。为了保护自己的账户不被攻击者克隆,我们可以使用CA和CCA来检查账户是否被克隆工具所使用。下面是详细的攻略。 1.获取受害者的DLT地址 首先需要获取受害者的DLT地址,可以通过区块链浏览器或者其他途径来获取。例如,我们获取到了地址为: dlt1…

    other 2023年6月27日
    00
  • 【历史】-windowsnt之父-davidcutler

    以下是详细讲解“【历史】Windows NT之父David Cutler的完整攻略,过程中至少包含两条示例说明”的Markdown格式文本: 【历史】Windows NT之父David Cutler David Cutler是一位计算机科学家,被誉为Windows NT操作系统的创造者和主要开发者。本攻略将介绍David Cutler的生平和Windows …

    other 2023年5月10日
    00
  • php用户名的密码加密更安全的方法

    下面是关于“PHP用户名的密码加密更安全的方法”的完整攻略: 1. 密码加密的重要性 在开发Web应用程序时,用户的密码存储是非常重要的。普通文本存储的密码容易被黑客攻击和泄露。因此,将密码加密存储是非常必要的。 2. 加密密码的方法 目前,常用的加密密码方法有散列哈希算法(如MD5、SHA1、SHA256)、bcrypt、Argon2等。故选择合适的加密方…

    other 2023年6月27日
    00
  • 关于vue.js过渡css类名的理解(推荐)

    关于vue.js过渡css类名的理解,我们可以从以下几方面来详细讲解: 什么是Vue.js的过渡? 在Vue.js中,过渡(transition)指的是元素的进入和离开过程。如果你不为元素的进入和离开设置过渡效果,那么这些过程就会很突兀,给用户带来不好的体验。所以,通过Vue.js提供的过渡功能,可以让元素的进入和离开过程平滑的显示,使用户感觉更加自然流畅。…

    other 2023年6月27日
    00
  • 解决python递归函数及递归次数受到限制的问题

    解决 Python 递归函数及递归次数受到限制的问题有两种方法,分别为手动设置递归深度和使用尾递归。 手动设置递归深度 Python 中的默认递归深度为 1000,所以如果超出了默认深度时就会抛出递归异常。我们可以使用 sys 模块来手动设置递归深度。 import sys sys.setrecursionlimit(3000) # 修改递归深度为 3000…

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