Vue 动态连接线

2023-11-18

尝试了两个连线库 jsplumb 和 leadline ,其实两个库都很强大,但是基于个人使用的习惯,决定还是用 leadline ,在Vue 下我使用它的一个包装库 leader-line-vue 


 下面是上图的连接线示例代码,连接线很轻松的就实现了一个渐变效果

<template>
  <div style="width: 100%; height: 100%">
    <svg ref="bar1" class="bar" :height="50"></svg>
    <svg ref="bar2" class="bar" :height="50"></svg>
  </div>
</template>

<script>
import interact from "interactjs";
import LeaderLine from 'leader-line-vue';
export default {
  data() {
    return {
      line: null
    }
  },
  mounted() {
    if (this.$refs.bar1) {
      this.drowBar(this.$refs.bar1);
    }
    if (this.$refs.bar2) {
      this.drowBar(this.$refs.bar2);
    }
    this.line = LeaderLine.setLine(this.$refs.bar1, this.$refs.bar2, { startSocket: 'right', endSocket: 'left', path: 'grid', 
       startPlugColor: '#ff3792', 
       endPlugColor: '#fff386',
       gradient: true });
  },
  methods: {
    drowBar(bar) {
      interact(bar).draggable({
        inertia: false,
        modifiers: [
          interact.modifiers.restrictRect({
            restriction: "parent", // 只能在父元素内拖动
            endOnly: true,
          }),
        ],
        autoScroll: true,
        listeners: {
          move: dragMoveListener,
          end: (event) => {
            let target = event.target;
            let x = (parseFloat(target.getAttribute("data-x")) || 0) + event.dx;
            let y = (parseFloat(target.getAttribute("data-y")) || 0) + event.dy;
            console.log(target.x);
            target.style.webkitTransform = target.style.transform =
              "translate(" + x + "px, " + y + "px)";
            target.setAttribute("data-x", x);
            target.setAttribute("data-y", y);
            this.line.remove();
            this.line = LeaderLine.setLine(this.$refs.bar1, this.$refs.bar2, { startSocket: 'right', endSocket: 'left', path: 'grid', 
              startPlugColor: '#ff3792', 
              endPlugColor: '#fff386',
              gradient: true });
          },
        },
      });
      function dragMoveListener(event) {
        let { x } = event.target.dataset;
        let { y } = event.target.dataset;
        x = (parseFloat(event.target.getAttribute("data-x")) || 0) + event.dx;
        y = (parseFloat(event.target.getAttribute("data-y")) || 0) + event.dy;
        Object.assign(event.target.style, {
          width: `${event.rect.width}px`,
          height: `${event.rect.height}px`,
          transform: `translate(${x}px, ${y}px)`,
        });
        event.target.setAttribute("data-x", x);
        event.target.setAttribute("data-y", y);
      }
      interact(bar).resizable({
        // 调整大小的时候确定哪些边可以拖动
        edges: { left: true, right: true, bottom: false, top: false },
        listeners: {
          end: (event) => {
            let target = event.target
            let x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx
            let y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy

            target.setAttribute('width', event.rect.width)
            target.setAttribute('height', event.rect.height)
            target.style.width = event.rect.width + 'px'
            target.style.height = event.rect.height + 'px'
            target.style.webkitTransform = target.style.transform = 'translate(' + x + 'px, ' + y + 'px)'
            target.setAttribute('data-x', x)
            target.setAttribute('data-y', y)
            this.line.remove();
            this.line = LeaderLine.setLine(this.$refs.bar1, this.$refs.bar2, { startSocket: 'right', endSocket: 'left', path: 'grid', 
              startPlugColor: '#ff3792', 
              endPlugColor: '#fff386',
              gradient: true });
          }
        },
        modifiers: [
          // // 拖拽时边缘只能在父容器里面
          // interact.modifiers.restrictEdges({
          //   outer: 'parent'
          // }),
          // // 最小宽高
          // interact.modifiers.restrictSize({
          //   min: { width: this.scale, height: this.barHeight }
          // })
        ],
        inertia: false,
        hold: 1
      })
      
    },
  },
  deactivated() {
    // 使用了 keep-alive 时注销掉所有事件
    if (this.$refs.bar) {
      if (interact.isSet(this.$refs.bar)) {
        interact(this.$refs.bar).unset();
      }
    }
  },
  beforeDestory() {
    // 组件销毁前注销掉所有事件
    if (this.$refs.bar) {
      if (interact.isSet(this.$refs.bar)) {
        interact(this.$refs.bar).unset();
      }
    }
  },
};
</script>

<style lang='less' scoped>
.bar {
  background-color: #0068E6;
  border-radius: 10px;
}
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue 动态连接线 的相关文章

  • Vuetify:v-ripple 只能用于块级元素

    我今天刚开始收到此错误 它破坏了我的整个网站 因为我像个傻瓜一样在页面加载时加载 Vuetify 有谁知道这意味着什么或如何解决它 谷歌搜索没有发现任何有用的信息 Edit 对于因网站也损坏而发现此问题的任何人 这可能是因为您加载的位置vu
  • onClick 处理程序在每个渲染周期触发

    我有这样的默认状态 this state selectedTab tab1 then 我的渲染方法是这样的 render const selectedTab this state return li tab1 li li tab2 li d
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • 如何将一个数组中的所有项目复制到另一个数组中?

    如何将数组的每个元素 其中元素是对象 复制到另一个数组中 以便它们完全独立 我不想更改一个数组中的元素来影响另一个数组 这里的关键是 数组中的条目是对象 并且 您不希望对一个数组中的对象的修改显示在另一个数组中 这意味着我们不仅需要将对象复
  • EmberJS:对象作为查询参数来刷新模型

    我遵循了查询参数指南 http guides emberjs com v1 11 0 routing query params http guides emberjs com v1 11 0 routing query params 而且效
  • 正则表达式中连字符的这种用法有效吗?

    NB I only想知道它是否是正则表达式定义中未转义连字符的有效应用 它是not关于匹配电子邮件 连字符或反斜杠的含义 量词或其他任何内容的问题 另外 请注意 链接的答案并没有真正讨论转义 未转义连字符之间的有效性问题 通常我会像这样声明
  • 使用javascript以编程方式触发iOS safari中的复制菜单?

    我正在尝试实现一种用户友好的方式 将一些文本从文本输入字段复制到 iOS Safari 上的剪贴板 我知道无法在这个平台上以编程方式完成此操作 但我希望能够尽可能地指导用户体验 在 iOS Safari 上 当用户手动突出显示某些文本时 会
  • 如何在 Vuejs 中加载 Pixi 实例?

    我正在 VueJS 组件中学习 PixiJS 如下所示Pixi教程 https github com kittykatattack learningPixi我控制台显示此错误 vue runtime esm js 2b0e 619 Vue
  • 如何封装Vuejs项目中的常用功能?最佳实践

    我正在开发一个使用 Vuejs 作为前端的中型项目 我正在探索的封装 分离可能在许多组件中使用的常用方法的选项包括 mixins 方法和插件方法 混合方法我必须在每个要使用 mixin 方法的组件 文件 中编写一条 import 语句 由于
  • 可以禁用幻灯片的触摸模拟但不能禁用滚动条(危险的滑动器)吗?

    我的页面上有一个危险的滑动器 它成功地模拟了幻灯片和随附滚动条上的触摸事件 允许单击鼠标并移动以向左或向右滑动幻灯片 这很好 但我现在在滑动器内的幻灯片上调用了可拖动 这意味着我需要停止此触摸模拟 拖动幻灯片并同时移动它们会引起混乱 但仅限
  • 播放没有音频标签的音频

    是否可以在没有音频标签的情况下仅使用 javascript 播放音频 我通过 tinyMce 编辑器注入脚本 因为我无权访问网站的后端 并且它不支持客户端的音频标签 她只想要当您将鼠标悬停在图像上时发出简单的声音 我已经完成了所有设置 但是
  • 从链接打开本地文件夹

    如何通过单击任何链接打开本地文件夹视图 我尝试了很多选择 例如 a href Open folder a or a Open folder a or a Open folder a 解决方案 启动可下载链接 以下内容适用于所有浏览器 但一如
  • 如何从 html 页面 [javascript] 调用 Web 服务方法而不刷新页面

    我有一个webservice这将返回一个值 我的要求是 我需要调用它webservice从一个index html页面 该页面有一个 html 提交按钮 在该按钮上单击我正在呼叫JavaScript 从那里我想调用网络方法 我怎样才能做到这
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • 如何从 CSS 选择器中提取类名?

    故事 我目前正在构建一个 ESLint 规则 以警告在 CSS 选择器定位器中使用引导布局导向和角度技术类 目前我在字符串方法中使用简单的子字符串 for var i 0 i lt prohibitedClasses length i if
  • 为什么 call 比 apply 快那么多?

    我想知道是否有人知道why call比apply 在 Chrome 中 速度大约快 4 倍 在 Firefox 中快 30 倍 我什至可以制作自定义原型 apply2 在大多数情况下 运行速度是apply 这个想法取自角度 Function
  • Firebase + Node.js:错误:找不到 XMLHttpRequest 兼容性库

    Firebase Node js On iOS 安装的 Node js npm 安装 firebase save 节点测试 js 其中 test js 是一个非常简单的连接到 Firebase 的脚本 var firebase requir
  • javascript - 如何获取对象名称或关联数组索引名称?

    我有一个像这样的 JSON 对象 var list name1 element1 value1 name2 element1 value2 如何提取所有 nameX 字符串值 例如 假设我想将它们连接在一个字符串中输出 例如 name1 n
  • Google 地图 API - 地图未显示 - 没有错误

    我正在尝试将地图从 Google API 加载到 div 中 但是 地图未加载 并且没有输出任何错误 这是代码 google maps var geocoder map function codeAddress address geocod
  • 如果 POST 响应仅包含 ID,如何将数据保存到我的 Ember 存储?

    Ember 数据期望我的服务器在每次成功后返回完整的对象POST 但是 我的 API 只返回一种元对象 其中包含id 当 Ember 收到此对象时 记录中的现有数据将被删除 除了id 例如 当我这样做时 var asset App Asse

随机推荐

  • 层叠上下文-《CSS 世界》阅读笔记

    层叠规则 目录 层叠规则 目录 z index 什么是层叠上下文 什么是层叠水平 层叠顺序 层叠准则 层叠上下文的特性 笔者个人理解 层叠上下文的创建 定位元素与传统层叠上下文 层叠上下文与层叠顺序 z index 负值深入理解 z ind
  • Ajax-发送请求的五个步骤

    概述 Asynchronous Javascript And XML AJAX 不是一门的新的语言 而是对现有技术的综合利用 ajax 是一种技术方案 依赖浏览器提供的 XMLHttpRequest 对象发出 HTTP 请求和接收 HTTP
  • python学习笔记(1)之如何在python3.x下安装PIL、numpy以及matplotlib

    本人是大菜鸟一枚 也是第一次动手写博客 希望能够通过写博客总结自己学到的知识 同时得到与大牛们交流的机会 本人所写的内容仅是自己的一点学习总结 若有不对的地方 欢迎大家的批评指正 安装python3 5 2 python3 5 x的下载路径
  • Chain of Responsibility:责任链模式

    现有多个处理者 这些处理者可以处理不同的请求 这些处理者有等级关系 每个处理者都有更上级的处理者 对于最上级的处理者 可以没有上级 对于一个上级处理者 可以有多个下级处理者 客户端发出了一个请求 请求被传递给一个最下级处理者 而该处理者无法
  • Spring框架的前世今生与系统架构

    课题 Spring框架的前世今生及系统概述 课程目标 1 通过对本章内容的学习 可以掌握Spring的基本架构及各子模块之间的依赖关系 2 了解Spirng的发展历史 启发思维 3 对Spring形成一个整体的认识 为之后的深入学习做铺垫
  • 资讯汇总230207

    230207 14 50 中国银河 硅料价格深V反弹 反映出需求回暖 中国银河研报称 春节后硅料价格快速回调 需求回暖支撑硅料上行 但硅料全年供过于求 短期反弹或难维持 政策目标明确 光伏高景气度将持续 随着硅料进入下行周期 光伏产业链利润
  • 彻底消除wine中文乱码

    wine下中文的配置方案 步骤 1 初始设置 运行 winecfg 把模拟的 Windows 系统设置为 Windows XP 或者 Windows 2000 不过亲测非必须 2 准备字体 为了让 Windows 应用程序看上去更美观 所以
  • mysql的checkpoint

    上一章的结尾我们留下了一个问题 就是在上一章所介绍的模型中 恢复管理器必须要通过全篇扫描整个undolog进行日志恢复 这样做显然是没有太大必要的 因为系统中断肯定是在最后几个事务受到影响 前面的事务应该已经完成commit或者rollba
  • 漏洞预警:Tomcat爆出安全绕过漏洞CVE-2018-1305 789多版本受影响

    Apache Tomcat爆出安全绕过漏洞 CVE编号CVE 2018 1305 Apache Tomcat 7 8 9多个版本受到影响 攻击者可以利用这个问题 绕过某些安全限制来执行未经授权的操作 这可能有助于进一步攻击 漏洞概述 在 A
  • 在react中如何结合antd实现分页功能

    在react中如何结合antd实现分页功能 步骤如下 1安装antd npm i antd s 2在 src App css中引入 antd dist antd css import antd dist antd css 3在需要用分页器的
  • Global illumination(全局光照或者全局照明) 概念

    Global illumination 全局光照或者全局照明 前言 在现实世界中 光能从一个曲面反弹到另一个曲面 这往往会使阴影变得柔和 并使照明比不反弹光能时更加均匀 但在 3D 图形学中 默认情况下光线不反弹 必须使程序生成反弹照明的模
  • 【C\C++学习】之十八、C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)

    在C 中 有三大函数复制控制 复制构造函数 赋值操作符 析构函数 而在C 11中 加入了移动构造函数 移动赋值操作符 我就斗胆将他们命名为六大函数好了 一 构造函数 c primer中说过 构造函数是特殊的成员函数 只要创建类类型的新对象
  • 安装liveCD lfslivecd-x86-6.3-r2160.iso 到虚拟机中

    转载请注明 谢谢 这篇文章的主要步骤是 gt 进入liveCD gt 格式化分区 hda1 hda5 hda6 最后系统装在hda1上 gt 把liveCD上的文件系统拷贝到分区 dev hda1上 gt 安装grub 和 内核 gt 重新
  • JS中的PadLeft、PadRight,位数不足,自动补位,String扩展方法

    类似C 中的 PadLeft PadRight方法 方法一 function FillZero p return new Array 3 p length 1 join 0 p FillZero 6 输出006 方法一扩展 C 中PadLe
  • 【转发】Win系统下如何在某个特定的文件夹内输出所有文件路径

    执行命令 dir S B gt list txt 在文件夹导航处 输入cmd然后回车 执行命令 dir S B gt list txt 执行命令 便有一个list txt文件生成 里面便是文件的完整路径 新生成的文件
  • 路由动画详解(附加代码效果)

    目录结构 环境准备 使用umi脚手架 动画属性详解 1 transform 变形 动画的实际效果 a C3中支持操作 b 使用介绍 rotate 旋转 translate 移动 scale 缩放 skew 扭曲 c 基点介绍 d 使用tra
  • 企业网上下单订货管理软件源码搭建功能介绍

    网上下单订货管理软件源码搭建功能介绍 订货通订单管理系统APP 一 系统概述和用途 系统基于网络 实现厂家和代理商批发商通过网络下单订货功能 什么是订货通 什么是企业订货管理系统 是一款针对中小型企业通过网络实现 厂家和客户 经销商 批发商
  • flutter 的 FutureBuilder使用时在wait部分无限循环,反复调用接口

    反复调用接口说明调用接口的方法反复被调用了 所以为了页面稳定 需要找到一种值调用一次改接口的方法 添加全局变量 var futureBuilderFuture 在初始化时唯一一次调用该接口 override void initState s
  • Pycharm通过ssh远程连接服务器

    目录 一 概述 二 步骤 1 连接服务器 2 设置Python解释器 3 建立Mapping 4 实现代码自动上传 一 概述 笔记本没有英伟达独显 需要跑深度学习的代码 可以使用pycharm远程连接服务器 将本机代码同步到实验室服务器中运
  • Vue 动态连接线

    尝试了两个连线库 jsplumb 和 leadline 其实两个库都很强大 但是基于个人使用的习惯 决定还是用 leadline 在Vue 下我使用它的一个包装库 leader line vue 下面是上图的连接线示例代码 连接线很轻松的就