vue3.x 使用jsplumb进行多列拖拽连线

news2025/2/27 21:08:07

前言:

最近很多小伙伴问到使用jsplumb进行多列拖拽连线怎么实现?
下面介绍vue3.x 使用jsplumb进行多列拖拽连线示例,以三列举例:

  1. 安装 npm install --save jsplumb
  2. 引入
<script lang="ts" setup>
  import {ref, reactive,onMounted} from 'vue'
  import jsPlumb from 'jsplumb'
</script>
  1. 使用
    在这里插入图片描述
<template>
    <h3>jsplumb使用 ( 多列 )</h3>
    <div id="container">
        <div class="col1">
            <div v-for="item in list1" :key="item.nodeId" :id="item.nodeId" name="source">{{ item.name }}</div>
        </div>
        <div class="col2">
            <div v-for="item in list2" :key="item.nodeId" :id="item.nodeId" name="center">{{ item.name }}</div>
        </div>
        <div class="col3">
            <div v-for="item in list3" :key="item.nodeId" :id="item.nodeId" name="target">{{ item.name }}</div>
        </div>
    </div>
</template>
<script lang="ts" setup>
import { ref, reactive, onMounted } from 'vue'
import jsPlumb from 'jsplumb'
//jsplumb使用
let $jsPlumb = jsPlumb.jsPlumb;
let jsPlumb_instance = null; // 缓存实例化的jsplumb对象
const list1 = reactive([
    { name: "name1", nodeId: "name1" },
    { name: "name2", nodeId: "name2" },
    { name: "name3", nodeId: "name3" },
    { name: "name4", nodeId: "name4" },
    { name: "name5", nodeId: "name5" },
    { name: "name6", nodeId: "name6" }
]);
const list2 = reactive([
    { name: '数据2-1', nodeId: 'data2-1' },
    { name: '数据2-2', nodeId: 'data2-2' },
    { name: '数据2-3', nodeId: 'data2-3' },
    { name: '数据2-4', nodeId: 'data2-4' },
    { name: '数据2-5', nodeId: 'data2-5' },
    { name: '数据2-6', nodeId: 'data2-6' }
]);
const list3 = reactive([
    { name: '数据3-1', nodeId: 'data3-1' },
    { name: '数据3-2', nodeId: 'data3-2' },
    { name: '数据3-3', nodeId: 'data3-3' },
    { name: '数据3-4', nodeId: 'data3-4' },
    { name: '数据3-5', nodeId: 'data3-5' },
    { name: '数据3-6', nodeId: 'data3-6' }
]);

onMounted(() => {
    showPlumb();
})

const showPlumb = () => {
    jsPlumb_instance = $jsPlumb.getInstance({
        Container: 'container', // 选择器id
        EndpointStyle: { radius: 0.11, fill: '#fff' }, // 端点样式
        PaintStyle: { stroke: '#000', strokeWidth: 2 }, // 绘画样式,默认8px线宽  #456
        HoverPaintStyle: { stroke: '#1E90FF' }, // 默认悬停样式  默认为null
        ConnectionOverlays: [ // 此处可以设置所有箭头的样式,因为我们要改变连接线的样式,故单独配置
            ['Arrow', { // 设置参数可以参考中文文档
                location: 1,
                length: 10,
                paintStyle: {
                    stroke: '#000',
                    fill: '#000'
                }
            }]
        ],
        Connector: ['Straight'], // 要使用的默认连接器的类型:直线,折线,曲线等
        DrapOptions: { cursor: 'crosshair', zIndex: 2000 }
    },)

    console.log(jsPlumb_instance)

    jsPlumb_instance.batch(() => {

        for (let i = 0; i < list1.length; i++) {
            initLeaf(list1[i].nodeId, 'source')
        }
        for (let i = 0; i < list2.length; i++) {
            initLeaf(list2[i].nodeId, 'center')
        }
        for (let i = 0; i < list3.length; i++) {
            initLeaf(list3[i].nodeId, 'target')
        }
    })


    jsPlumb_instance.bind('click', (conn, originalEvent) => {
        jsPlumb_instance.deleteConnection(conn)
    })

}

// 初始化具体节点
const initLeaf = (id, type) => {
    const ins = jsPlumb_instance;
    const elem = document.getElementById(id)
    if (type == 'source') {
        ins.makeSource(elem, {
            anchor: 'Right',
            allowLoopback: false,
            maxConnections: 1
        })
    } else if (type == 'center') {//中间列,即能主动连接,也能被动连接
        ins.makeSource(elem, {
            anchor: 'Right',
            allowLoopback: false,
            maxConnections: 1
        })
        ins.makeTarget(elem, {
            anchor: 'Left',
            allowLoopback: false,
            maxConnections: 1
        })
    } else {
        ins.makeTarget(elem, {
            anchor: 'Left',
            allowLoopback: false,
            maxConnections: 1
        })
    }
}

</script>

<style scoped lang="less">
#container {
    position: relative;
    margin-top: 20px;
    width: 100%;
    height: 300px;
}

.col2,
.col1,
.col3 {
    float: left;
    text-align: center;
}

.col1 {
    width: 80px;
}

.col2 {
    width: 120px;
    margin-left: 80px;
}

.col3 {
    width: 120px;
    margin-left: 80px;
}

#container>div>div {
    line-height: 30px;
    margin: 0 0 17px 0;
    background: #ef631e;
    color: #fff;
}
</style>

小伙伴们对jsplumb感兴趣的话,可以查看我的其他几篇关于jsplumb文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1528433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

#Linux(VIM编辑器使用)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;打开一个文本文件输入vi文件名&#xff08;如果存在该文件则直接打开&#xff0c;如果没有则创建一个文件&#xff09; &#xff08;2&…

【早鸟优惠|高录用|EI稳定检索】2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)诚邀投稿/参会!

【早鸟优惠|高录用|EI稳定检索】 2024年虚拟现实、图像和信号处理国际学术会议&#xff08;ICVISP 2024&#xff09;诚邀投稿/参会&#xff01; # 早鸟优惠 # 先投稿先送审 # #投稿免费参会、口头汇报及海报展示# 2024年虚拟现实、图像和信号处理国际学术会议&#xff08;I…

递推与递归

92. 递归实现指数型枚举 - AcWing题库 #include <bits/stdc.h> using namespace std; const int N17; int n; bool vis[N];//记录某一个数是否出现过 void dfs(int dep){// if(vis[dep])continue;//没有这一句 因为一定不会有已经选过的数if(depn1){//对于每个数都做完了…

C++ QT串口通信(2)-串口通信入门实例

本文通过实例讲解C++ QT串口通信。 入门实例设计一个串口助手,能够很好的涵盖串口要点的使用。 成品图 如下; 实现代码如下: 首先在pro文件中添加串口模块 UI界面如下 <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0&q…

漏洞挖掘 | 记一个奇怪的万能密码

前言 打的站点打多了&#xff0c;什么奇怪的问题都会发生 打点 开局一个登录框 用户枚举到账号爆破 测了一下&#xff0c;没发现admin的弱口令&#xff0c;但是发现存在用户枚举漏洞&#xff0c;因此准备跑一下账号 输入密码为123456 进行账号爆破 成功爆破出账号 是的…

综合知识篇10-计算机网络考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

【读书笔记】 40本脑科学书籍总结出的方法论——《涂鸦启示录》我庆幸没有错过

文章目录 《费曼学习法》《SMART法则》 概述原书内容脉络第一部分 目标管理第二部分 习惯养成第三部分 时间管理第四部分 思维方式第五部分 学习方法第六部分 解决问题 拓展 阅读体验感受评价补充&#xff1a; 总结 《涂鸦启示录》是诸多认知&#xff0c;思维书籍、演讲的大合集…

angularjs 指令实现自定义滚动条

场景&#xff1a;横向商品栏&#xff0c;把原有的滚动条改成自定义的样式&#xff0c;并且给两边加上箭头可以调整&#xff0c;可以拖动商品和滚轮实现滚动条效果。 js appService.directive(customScrollbar, function() {return {restrict: A,transclude: true,scope: {ena…

MATLAB环境下基于离散小波变换和主成分平均的医学图像融合方法

随着计算机技术和生物影像工程的日趋成熟&#xff0c;医学图像为医疗诊断提供的信息越来越丰富。目前&#xff0c;由于医学成像的设备种类繁多&#xff0c;导致医生获得的图像信息差异较大。如何把这些信息进行整合供医生使用成为当务之急。基于此&#xff0c;医学图像融合技术…

php 对接Mintegral汇量海外广告平台收益接口Reporting API

今天对接的是Mintegral广告reporting api接口&#xff0c;拉取广告收益回来自己做统计。记录分享给大家 首先是文档地址,进入到Mintegral后台就能看到文档地址以及参数&#xff1a; 文档地址&#xff1a;https://cdn-adn-https.rayjump.com/cdn-adn/reporting_api/MintegralRA.…

2024你值得拥有,Go语言入门学习线路推荐

“小众”的编程语言的Go语言在今年2月成功挤进TOIBE排行榜前10&#xff0c;3月稳居第8名。从最低时的第122名&#xff0c;到现在第8名&#xff0c;Go 的身影越来越清晰。 其实它早已被广泛应用于云计算、大数据、区块链、微服务、游戏开发等领域&#xff0c;因而也有越来越多的…

相比于 HTTP 协议,WebSocket协议的必要性体现在哪里?

HTTP 协议的一个缺点 从 HTTP 协议的角度来看&#xff0c;就是点一下网页上的某个按钮&#xff0c;前端发一次 HTTP请 求&#xff0c;网站返回一次 HTTP 响应。这种由客户端主动请求&#xff0c;服务器响应的方式也满足大部分网页的功能场景。但是有没有发现&#xff0c;在HTTP…

WiFi7为什么需要6G频谱

从5925MHz到7125MHz&#xff0c;整整1200MHz的频谱&#xff0c;都被分配给了WiFi7。非常得豪&#xff01; 只是国内还没有这个东西。 为什么要这么宽的频谱呢&#xff1f; Intel作过实验&#xff0c;发现在日常的场合下 一定是3个320MHz宽的不重叠信道&#xff0c;方能达到AV/…

小游戏实战-Python实现石头剪刀布+扫雷小游戏

小游戏实战-Python实现石头剪刀布扫雷小游戏 我想说废话止于此石头剪刀布-入门必学游戏游戏规则实现思路示例代码知识要点运行效果 扫雷-内网摸鱼必备游戏游戏规则实现思路示例代码知识要点运行效果 进阶练习-走迷宫&#xff08;预留&#xff09;游戏规则预期效果 总结 我想说 …

算法第三十天-矩阵中移动的最大次数

矩阵中移动的最大次数 题目要求 解题思路 网格图 DFS 从第一列的任一单元格 ( i , 0 ) (i,0) (i,0) 开始递归。枚举往右上/右/右下三个方向走&#xff0c;如果走一步后&#xff0c;没有出界&#xff0c;且格子值大于 g r i d [ i ] [ j ] grid[i][j] grid[i][j]&#xff0c;则…

Java使用itextpdf往pdf中插入图片

引入maven依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.9</version> </dependency>java代码 import cn.hutool.extra.qrcode.QrCodeUtil; import com.itextpdf.text.*; i…

华为携手8家企业打造“AI大模型+行业”生态网络 | 百能云芯

据媒体报道&#xff0c;在“大模型行业创新合作计划”签约仪式上&#xff0c;华为云携手循环智能、迪安诊断、零浩网络、云译科技、蓝青教育、航天天目、标普云、乐聚机器人等8家企业&#xff0c;共同开启了一段全新的合作旅程。 这次合作将聚焦于“AI大模型行业”的应用开发&a…

IP代理的认证方式和协议介绍

“IP代理是指使用固定的IP地址作为代理服务器进行代理访问的方式。在网络应用中&#xff0c;IP代理可以为用户提供更加稳定的代理服务&#xff0c;同时也提高了访问网站的安全性。IP代理的认证方式和协议是实现代理服务的重要组成部分。” 一、认证方式 1.用户名和密码认证&am…

RK平台第一次开机速度优化 “Large app, accepted running with swap.“

RK平台第一次开机速度优化 "Large app, accepted running with swap." 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip OS:Android 6.0.1 CPU:3368 Kernel: 3.10 问…

Elasticsearch:使用 OpenAI、LangChain 和 Streamlit 的基于 LLM 的 PDF 摘要器和 Q/A 应用程序

嘿&#xff01; 您是否曾经感觉自己被淹没在信息的海洋中&#xff1f; 有这么多的书要读&#xff0c;而时间却这么少&#xff0c;很容易就会超负荷&#xff0c;对吧&#xff1f; 但猜猜怎么了&#xff1f; 你可以使用大型语言模型创建自定义聊天机器人&#xff0c;该模型可以帮…