首页 > 其他分享 >vue3 jsPlumb学习

vue3 jsPlumb学习

时间:2023-11-27 18:15:09浏览次数:37  
标签:学习 const uuid 连线 jsPlumb item vue3 id

<template>
  <div class="box">
    <div @click="clearLine">clear</div>
    <div @click="initConponents">line</div>
    <div @click="getData">get</div>
  </div>
  <div class="wrapper" ref="wrapper">
    <div class="left_box com_box">
      <div class="source_title com_title">{{ props.sourceTitle }}</div>
      <div class="content_box" id="content_box1">
        <div
          class="item_box"
          :id="item.id"
          v-for="(item, index) in sourceList"
          :key="`item-${index}`"
        >
          {{ item.name }}
        </div>
      </div>
    </div>
    <div class="right_box com_box">
      <div class="target_title com_title">{{ props.targetTitle }}</div>
      <div class="content_box" id="content_box2">
        <div
          class="item_box"
          :id="item.id"
          v-for="(item, index) in targetList"
          :key="`item-${index}`"
        >
          {{ item.name }}
        </div>
      </div>
    </div>
  </div>
</template>
<script setup>
import { jsPlumb } from 'jsplumb'
const props = defineProps({
  targetTitle: {
    type: String,
    default: '目标字段'
  },
  sourceTitle: {
    type: String,
    default: '源字段'
  }
})
const wrapper = ref()
// 公共样式  点样式和连线样式
const commonData = {
  isSource: true, // 是否允许被手动连线
  isTarget: true, // 是否允许被手动连线
  connectorStyle: { stroke: '#5085E2', strokeWidth: '2', dashstyle: '0' }, // 自定义连线时的颜色
  connectorHoverStyle: {
    lineWidth: 3,
    strokeStyle: '#ff3040',
    stroke: '#ff3040'
  }, // 自定义线段连接后 鼠标经过的颜色 宽度
  connectorOverlays: [['Arrow', { width: 10, length: 10, location: 1 }]], // 自定义连线时箭头的样式
  connector: ['Bezier', { curviness: 50 }], // 连线样式
  anchor: ['Left', 'Right'], // 点的位置
  endpointStyle: { fill: '#5085E2', outlineWidth: 2 }, // 点的样式
  endpointHoverStyle: { fill: '#ff3040', outlineWidth: 2 }, // 初始化连接时鼠标经过时点的样式
  paintStyle: { stroke: '#5085E2', strokeWidth: 2 }, // 初始化连接时连线的颜色 宽度
  hoverPaintStyle: { stroke: '#ff3040', strokeWidth: 2 }, // 初始化连接时鼠标经过时的连线颜色 宽度
  overlays: [['Arrow', { width: 10, length: 10, location: 1 }]], // 初始化连接时箭头样式 location 0.5 箭头在中间 1在右侧
  endpoint: [
    'Dot',
    {
      radius: 5, // 圆的大小
      fill: '#5085E2'
    }
  ], // 端点样式设置
  DragOptions: { cursor: 'crosshair' },
  ConnectionsDetachable: false // 禁用拖到取消连线
}
const sourceList = ref([])
const targetList = ref([])
const initConponents = () => {
  // 通过index (同行)
  const source = sourceList.value.map((item) => item.id)
  const target = targetList.value.map((item) => item.id)
  // 通过uuid连接(自定义)
  // const source = sourceList.value.map((item) => item.uuid)
  // const target = targetList.value.map((item) => item.uuid)
  source.forEach((item, index) => {
    // 连线
    jsPlumb.connect({ uuids: [item, target[index]] }, commonData)
  })
}
const clearLine = () => {
  const doms = document.querySelectorAll('.item_box')
  doms.forEach((item) => {
    // 根据id删除点的连线
    jsPlumb.deleteConnectionsForElement(item.id)
  })
}
const getData = () => {
  // 获取全部连接线段的数据,通过id去list中查找,处理成接口想要的数据格式
  console.log(jsPlumb.getAllConnections())
}
onMounted(() => {
  jsPlumb.getInstance()
  const list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  list.forEach((item, index) => {
    targetList.value.push({
      name: `target-${item}`, // 展示字段
      id: `target-${index}`, // id
      uuid: `target-${item}` // 动态设置连接的id
    })
    sourceList.value.push({
      name: `source-${item}`,
      id: `source-${index}`,
      uuid: `source-${item}`
    })
  })
  nextTick(() => {
    sourceList.value.forEach((item) => {
      const dom = document.querySelector(`#${item.id}`)
      // addEndpoint 添加右侧点位
      jsPlumb.addEndpoint(
        dom,
        {
          anchor: ['Right'],
          uuid: item.id // 如果是同行连接 uuid: item.id  如果是uuid  uuid: item.uuid  注意 需要和initConponents map条件一致
        },
        // 点的样式
        { ...commonData, maxConnections: 1 }
      )
    })
    targetList.value.forEach((item) => {
      const dom = document.querySelector(`#${item.id}`)
      // addEndpoint 添加左侧点位
      jsPlumb.addEndpoint(
        dom,
        {
          anchor: ['Left'],
          uuid: item.id // 如果是同行连接 uuid: item.id  如果是uuid  uuid: item.uuid 注意 需要和initConponents map条件一致
        },
        // 点的样式
        { ...commonData, maxConnections: 1 }
      )
    })
  })

  // 添加单击连线事件
  // jsPlumb.bind('click', function (conn) {
  //   // 删除线
  //   jsPlumb.deleteConnection(conn)
  // })

  // 鼠标经过线的样式
  jsPlumb.bind('mouseover', function (conn) {
    for (let i of document.querySelectorAll('.jtk-connector')) {
      i.style.cursor = conn.targetId === 'r_dataDictionary' ? 'default' : 'pointer'
    }
  })

  // 鼠标离开线的样式
  jsPlumb.bind('mouseout', function (conn) {
    for (let i of document.querySelectorAll('.jtk-connector')) {
      i.style.cursor = conn.targetId === 'r_dataDictionary' ? 'default' : 'pointer'
    }
  })

  // 连线之前,是否可连接检查
  jsPlumb.bind('beforeDrop', function (info) {
    // return false 不允许连接  true 允许连接
    const sourceId = info.sourceId.split('-')[0]
    const targetId = info.targetId.split('-')[0]
    // 不允许连接同一侧的点 或者 不允许从右侧拉线到左侧   只能从左到右拉线
    if (sourceId === targetId || sourceId.includes('target')) return false
    return true
  })

  // 连线成功之后的回调
  // jsPlumb.bind('connection', function (info) {
  //   console.log(info.connection, 9, info)
  // })
})
</script>
<style lang="less" scoped>
.box {
  display: flex;
  width: 500px;
  justify-content: space-between;
  align-items: center;
  margin: 50px auto;
}
.wrapper {
  width: 1000px;
  height: 500px;
  margin: 200px auto 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  .com_box {
    width: 30%;
    height: 100%;
    border: 1px solid #ccc;
    display: flex;
    flex-direction: column;
  }
  .com_title {
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 12px;
    height: 30px;
    line-height: 30px;
    margin-bottom: 10px;
    color: #fff;
    background-color: #ccc;
  }
  .content_box {
    height: 0;
    flex: 1;
    width: 100%;
    overflow: auto;
    display: flex;
    flex-direction: column;
    padding: 0 10px;
    box-sizing: border-box;
    > div {
      height: 20px;
      line-height: 19px;
      border-bottom: 1px solid #ccc;
      color: #ccc;
      white-space: nowrap; /* 不换行 */
      overflow: hidden; /* 超出部分不显示 */
      text-overflow: ellipsis; /* 超出部分显示为... */
      border: 1px solid #ccc;
      border-bottom: none;
      padding: 0 8px;
      box-sizing: border-box;
      &:last-child {
        border-bottom: 1px solid #ccc;
      }
    }
  }
}
</style>

标签:学习,const,uuid,连线,jsPlumb,item,vue3,id
From: https://www.cnblogs.com/demoTimes/p/17859999.html

相关文章

  • Hadoop第四天学习记录
    经过四天的Hadoop学习,我对这个分布式存储和处理框架有了更深入的了解。今天,我主要学习了Hadoop的生态系统中的其他组件和工具,以及如何在实际场景中应用Hadoop来解决实际问题。首先,我学习了Hadoop生态系统中的其他组件和工具,如Hive、HBase、Pig、Sqoop等。Hive是一个数据仓库工具,它......
  • vue3使用kindeditor富文本编辑器组件,支持上传图片(接口或base64)
    参考文章:https://blog.csdn.net/qq_27936291/article/details/1247689891.安装插件npmi@zhj-target/vue3-kind-editor--save或者yarnadd@zhj-target/vue3-kind-editor2.在vue项目中使用importVue3KindEditorfrom'@zhj-target/vue3-kind-editor'conststate=re......
  • Linux学习难点
    Linux主要难点如下:1.命令行操作:Linux系统采用的是基于文本的命令行操作方式,对于没有接触过命令行的人来说可能会不太习惯。2.权限管理:Linux系统中的权限管理非常严格,需要了解用户、用户组、文件权限等相关概念。3.Shell编程:Shell编程是Linux系统中常用的一种脚本语言,......
  • Python爬虫如何与机器学习相结合
    随着互联网技术的发展,数据已经成为了人类社会中不可或缺的一部分。在这样的背景下,Python爬虫和机器学习成为了两个非常有用的工具。Python爬虫可以用于数据采集和处理,而机器学习则可以用于模型训练和预测。本文将介绍如何将Python爬虫和机器学习相结合,以实现更加高效的数据处理和分......
  • Datewhale学习笔记05
    Datewhale学习笔记5$\textcolor{blue}{Datewhale学习笔记}$$\textcolor{red}{chap5}$聪明办法学Python2ndEditionChapter5循环Loopfor循环和循环范围for循环的特点基于提供的范围,重复执行特定次数的操作In[1]defsumFromMToN(m,n):total=0#注意:ra......
  • R入门学习3
    三、R语言中的基本概念•常量•在程序运行过程中,其值不能被改变的量被称为常量,例如圆周率pi•在R中没有常量类型的概念•变量1.值可以改变的量是变量,每一个变量都有一个名字,例如例子中的fistString2.变量名可以包含英文字母、数字、下划线和英文句号(.)......
  • Linux学习随笔——Vim编辑器
    Vi编辑器是Linux上最基本的文本编辑器,Vim是Vi的增强版;Vim编辑器主要有三种模式:命令模式、编辑模式、末行模式(扩展命令模式);命令模式:控制光标,对文件进行复制、粘贴、删除、查询等操作;编辑模式:进行文本录入与更改;末行模式:文档保存与退出,设置编辑环境;具体操作:打开Vim编辑器后,默认......
  • Spring MVC学习随笔-控制器(Controller)开发详解:接受客户端(Client)请求参数
    学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅第三章、SpringMVC控制器开发详解3.1核心要点......
  • 华为认证 | Security安全认证学什么?IA、IP、IE学习内容详解!
    互联网高速发展的如今,网络安全愈发受到重视,所以很多互联网相关的认证都推出了安全方向的认证。作为国内一大厂商的华为自然也是不例外的,毕竟华为认证覆盖ICT全领域,怎么会少得了安全方向呢?那么网络安全华为认证到底是什么?有何用处?接下来在这篇文章中为大家讲解清楚。01网络安全华......
  • 2023-2024-1 20232309 《网络空间安全导论》第12(3)周学习总结
    2023-2024-120232309《网络空间安全导论》第12(3)周学习总结教材学习内容总结有点草率地看了一下课本,实在是无力细究......相对空泛的内容看书就行,就不写在思维导图里浪费时间了教材学习中的问题和解决过程1.重放攻击为什么可以造成伤害?chat-gpt对重放攻击的防御基于AI......