当前位置:首页 > VUE

vue实现拖拽连线

2026-03-08 12:11:33VUE

Vue 实现拖拽连线

使用 vue-draggable 和 vue-connection-line

安装依赖库:

npm install vue-draggable vue-connection-line

在 Vue 组件中引入:

import Draggable from 'vuedraggable'
import VueConnectionLine from 'vue-connection-line'

模板部分实现拖拽元素和连线:

<template>
  <div>
    <draggable v-model="nodes" @end="onDragEnd">
      <div v-for="node in nodes" :key="node.id" class="node">
        {{ node.name }}
      </div>
    </draggable>

    <vue-connection-line 
      :connections="connections"
      :elements="nodes"
      element-id="id"
    />
  </div>
</template>

脚本部分定义数据和连接关系:

export default {
  components: { Draggable, VueConnectionLine },
  data() {
    return {
      nodes: [
        { id: 1, name: 'Node 1', x: 50, y: 50 },
        { id: 2, name: 'Node 2', x: 200, y: 200 }
      ],
      connections: [
        { from: 1, to: 2 }
      ]
    }
  },
  methods: {
    onDragEnd() {
      // 拖拽结束处理逻辑
    }
  }
}

自定义实现方案

创建可拖拽节点组件:

Vue.component('drag-node', {
  template: `
    <div class="node" 
         draggable="true"
         @dragstart="dragStart"
         @dragend="dragEnd">
      <slot></slot>
    </div>
  `,
  methods: {
    dragStart(e) {
      e.dataTransfer.setData('nodeId', this.$vnode.key)
    },
    dragEnd() {
      // 处理拖拽结束
    }
  }
})

实现画线功能:

function drawLine(fromEl, toEl) {
  const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
  const line = document.createElementNS('http://www.w3.org/2000/svg', 'line')

  const fromRect = fromEl.getBoundingClientRect()
  const toRect = toEl.getBoundingClientRect()

  line.setAttribute('x1', fromRect.left + fromRect.width/2)
  line.setAttribute('y1', fromRect.top + fromRect.height/2)
  line.setAttribute('x2', toRect.left + toRect.width/2)
  line.setAttribute('y2', toRect.top + toRect.height/2)
  line.setAttribute('stroke', 'black')

  svg.appendChild(line)
  document.body.appendChild(svg)
}

使用第三方库 jsplumb

安装 jsplumb:

npm install jsplumb

在 Vue 中使用:

import { jsPlumb } from 'jsplumb'

export default {
  mounted() {
    this.initJsPlumb()
  },
  methods: {
    initJsPlumb() {
      jsPlumb.ready(() => {
        jsPlumb.connect({
          source: 'node1',
          target: 'node2',
          anchors: ['Right', 'Left'],
          connector: ['Straight']
        })
      })
    }
  }
}

性能优化建议

批量更新节点位置时使用 requestAnimationFrame:

function updateNodePositions() {
  requestAnimationFrame(() => {
    // 更新节点位置逻辑
  })
}

对于复杂场景考虑使用 WebGL 渲染库如 PIXI.js:

vue实现拖拽连线

import * as PIXI from 'pixi.js'

const app = new PIXI.Application()
document.body.appendChild(app.view)

const graphics = new PIXI.Graphics()
app.stage.addChild(graphics)

// 绘制连线
graphics.lineStyle(2, 0x000000)
graphics.moveTo(x1, y1)
graphics.lineTo(x2, y2)

标签: 拖拽vue
分享给朋友:

相关文章

vue怎么实现选中删除

vue怎么实现选中删除

实现选中删除功能的方法 在Vue中实现选中删除功能通常涉及以下几个关键步骤: 数据绑定与选中状态管理 使用v-model或v-for指令绑定列表数据,结合复选框或单选按钮实现选中状态管理。例如:…

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个渐进式 JavaScript 框架,广泛用于构建用户界面。以下是 Vue 功能的常见实现方法。 数据绑定 Vue 的核心功能之一是数据绑定,通过 v-mod…

vue实现input

vue实现input

Vue 实现 Input 输入框的方法 基本双向绑定 使用 v-model 指令实现双向数据绑定,适用于大多数表单场景: <template> <input v-model="…

vue实现排序

vue实现排序

Vue 实现排序的方法 在 Vue 中实现排序可以通过多种方式完成,以下是一些常见的方法: 使用计算属性排序数组 计算属性非常适合对数据进行排序,因为它会在依赖的数据变化时自动更新。以下是一个示例:…

vue轮询实现

vue轮询实现

Vue 轮询实现方法 在 Vue 中实现轮询可以通过以下几种方式: 使用 setInterval data() { return { pollInterval: null } },…

vue实现音乐

vue实现音乐

Vue实现音乐播放功能 使用Vue实现音乐播放功能可以通过多种方式完成,以下是几种常见的实现方法: 使用HTML5 Audio API 在Vue组件中直接使用HTML5的Audio对象来控制音乐播放…