vue使用jsplumb 流程图

news2024/12/23 17:53:22
  1. 安装jsPlumb库:在Vue项目中使用npm或yarn安装jsPlumb库。

npm install jsplumb

  1. 创建一个Vue组件:创建一个Vue组件来容纳jsPlumb的功能和呈现。
<template>
  <div style="margin: 20px">
    <div style="margin: 20px">
      <el-button type="primary" size="mini" @click="clearCanvas()"
        >清除连线</el-button
      >
      <el-button type="primary" size="mini" @click="startCanvas()"
        >绘制</el-button
      >
    </div>
    <div class="liucFlex" id="flowContainer">
      <div class="left">
        <div
          @click="clickTitle(item)"
          class="boxLiu"
          v-for="(item, index) in aItem"
          :key="index"
        >
          <div class="word" :class="{ isClick: activeName == item.id }">
            <div><i class="el-icon-view iconRight"></i>{{ item.name }}</div>
            <div class="date">{{ item.date }}</div>
          </div>
          <div class="status" :class="item.status" :id="item.id"></div>
        </div>
      </div>
      <div class="right">
        <div
          class="boxLiu"
          @click="clickTitle(item)"
          v-for="(item, index) in bItem"
          :key="index"
        >
          <div class="status" :class="item.status" :id="item.id"></div>
          <div class="word" :class="{ isClick: activeName == item.id }">
            <div>{{ item.name }}<i class="el-icon-view iconRight"></i></div>
            <div class="date">{{ item.date }}</div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import { jsPlumb } from "jsplumb";

export default {
  name: "table4",
  props: {},
  components: {},
  data() {
    return {
      // status: 表示连接线状态;error:红色,success:绿色,info:灰色
      aItem: [
        {
          name: "a节点1",
          date: "2023-01-01 20:46",
          id: "1",
          status: "error",
        },
        {
          name: "a节点2",
          date: "2023-01-01 20:46",
          id: "2",
          status: "success",
        },
        {
          name: "a节点3",
          date: "2023-01-01 20:46",
          id: "3",
          status: "success",
        },
        {
          name: "a节点4",
          date: "2023-01-01 20:46",
          id: "4",
          status: "success",
        },
        {
          name: "a节点5",
          id: "5",
          status: "info",
        },
        {
          name: "a节点6",
          id: "6",
        },
        {
          name: "a节点7",
          date: "2023-01-01 20:46",
          id: "7",
          status: "success",
        },
      ],
      bItem: [
        {
          name: "b节点1",
          date: "2023-01-01 20:46",
          id: "11",
          status: "error",
        },
        {
          name: "b节点2",
          date: "2023-01-01 20:46",
          id: "12",
          status: "error",
        },
        {
          name: "b节点3",
          id: "13",
        },
        {
          name: "b节点4",
          date: "2023-01-01 20:46",
          id: "14",
          status: "success",
        },
        {
          name: "b节点5",
          date: "2023-01-01 20:46",
          id: "15",
          status: "success",
        },
        {
          name: "b节点6",
          id: "16",
        },
        {
          name: "b节点7",
          id: "17",
        },
      ],
      plumbIns: null, // 折线初始化的对象
      activeName: null, // 当前选中高亮的id
      // 步骤图的默认配置
      defaultConfig: {
        // 对应上述基本概念
        anchor: ["TopCenter",[0.5, 1, 0, 0]],
        connector: ["Flowchart", { cornerRadius: 0, width: 1, curviness: 50 }],
        endpoint: "Blank",
        // 添加样式
        paintStyle: { stroke: "#E0E3EA", strokeWidth: 1, curviness: 100 }, // connector
        // 添加 overlay,如箭头
        overlays: [["Arrow", { width: 5, length: 5, location: 1 }]], // overlay
      },
    };
  },
  computed: {},
  watch: {},
  created() {},
  mounted() {
    this.setPlumbIns();
  },
  activated() {
    // this.setPlumbIns();
  },
  // 路由切换的时候一定要重置setPlumbIns,防止保留上次绘制的线
  deactivated() {
    this.clearCanvas();
  },
  beforeDestroy() {
    this.clearCanvas();
  },
  methods: {
    // 点击清除连线
    clearCanvas() {
      if (this.plumbIns) this.plumbIns?.reset();
    },
    // 绘制连线
    startCanvas() {
      this.setPlumbIns();
    },
    // 点击切换事件
    clickTitle(item) {
      this.activeName = item.id;
    },
    // 初始化连线
    setPlumbIns() {
      if (!this.plumbIns)
        // 一定要指定连接线的绘制容器,该容器为设置的盒子dom的id值,要给这个css盒子设置一个position:relative属性,不然连线的位置不对,会偏移的很严重,如果不设置将以body容器进行绘制
        this.plumbIns = jsPlumb.getInstance({
          Container: "flowContainer",
        });
      let relations = [];
      // 将新数组转换成所需格式
      for (let i = 0; i < this.aItem.length - 1; i++) {
        relations.push([this.aItem[i].id, this.aItem[i + 1].id]);
      }
      // 获取right的数组
      for (let i = 0; i < this.bItem.length - 1; i++) {
        relations.push([this.bItem[i].id, this.bItem[i + 1].id]);
      }
      let aTob = [];
      // left和right节点相接的地方
      aTob.push(["4", "11"]);
      aTob.push(["15", "7"]);
      this.plumbIns.ready(() => {
        // 默认连线
        for (let item of relations) {
          this.plumbIns.connect(
            {
              source: item[0],
              target: item[1],
            },
            this.defaultConfig
          );
        }
        // a和b相交的连线
        let aTobConfig = JSON.parse(JSON.stringify(this.defaultConfig));
        // 设置a与b节点连接线的方式
        aTobConfig.anchor = ["Left", "Right"];
        for (let item of aTob) {
          this.plumbIns.connect(
            {
              source: item[0],
              target: item[1],
            },
            aTobConfig
          );
        }
      });
    },
  },
};
</script>

<style lang="scss" scoped>
.liucFlex {
  display: flex;
  width: 500px;
  color: #101010;
  font-size: 14px;
  position: relative;
  .word {
    width: 110px;
    height: 50px;
    cursor: pointer;
  }
  .isClick {
    color: #409eff !important;
  }
  .right,
  .left {
    flex: 1;
    margin: 0 10px;
  }
  .right {
    .iconRight {
      margin-left: 5px;
    }
    .status {
      margin-right: 10px;
    }
  }
  .left {
    .iconRight {
      margin-right: 5px;
    }
    .status {
      margin-left: 10px;
    }
    .boxLiu {
      text-align: right;
    }
  }
  .boxLiu {
    display: flex;
    margin-bottom: 20px;
  }
  .status {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background-color: #e0e3ea;
    vertical-align: top;
    margin-top: 3px;
  }

  .date {
    font-size: 12px;
    margin-top: 10px;
    color: #d0d3d9;
  }
  .error {
    background-color: #f56c6c !important;
  }
  .success {
    background-color: #7ac756 !important;
  }
  .info {
    background-color: #e0e3ea !important;
  }
}
</style>

效果图:

 

 

  1.  初始化jsPlumb一定要在mounted函数里面,要执行在dom渲染完成的时候
  2. 一定要设置绑定的容器,不然连线的容器外加入任何其他布局元素,线会偏移,需要给绑定的容器设置position:relative(原因不详,因为我不设置这个属性线偏移的很严重)
  3. 路由切换或者多容器需要连线设置,需要重置jsPlumb(this.plumbIns?.reset()),不然线会一直在
jsPlumb中一些常用的参数和API的说明
参数/方法描述
Container设置连接线的绘制容器,将连接线限制在指定的容器内绘制
Draggable将元素设置为可拖动,可以被拖动到其他位置
Endpoint定义连接线端点的样式和行为
Connector定义连接线的样式和类型
Anchors定义连接线起始点和目标点的锚点位置
PaintStyle定义连接线的绘制样式,如颜色、线宽等
hoverPaintStyle鼠标悬停在连接线上时的绘制样式
Endpoints定义连接线的起始点和目标点的端点样式
MaxConnections指定一个元素可以拥有的最大连接数
Scope用于分组连接线和元素的范围,可以控制连接线的可见性和交互性
ConnectionOverlays定义连接线上的覆盖物,如箭头、标签等
addEndpoint动态添加一个连接线的端点
connect连接两个元素,创建一条连接线
repaintEverything重新绘制所有连接线和端点,适用于当容器大小改变时需要重新布局时
bind绑定事件处理程序到连接线或元素上
unbind取消绑定事件处理程序
removeAllEndpoints移除所有元素的端点
deleteEndpoint删除指定元素的一个端点
destroy销毁jsPlumb实例,清除所有的连接线和端点

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

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

相关文章

20款美规奔驰GLS450更换AMG GLS63原厂刹车卡钳,刹车效果强悍无比

对于M.Benz的车迷来说&#xff0c;AMG必定是他们的圣物&#xff0c;经过AMG改装的成品无一不是拥有动力强横&#xff0c;目操控性、舒适性都能够兼备的。下面所介绍的这套制动系统&#xff0c;便是由AMG出品的大六活塞卡钳及大直径开孔刹车碟&#xff0c;所组成的制动套件。

UE4/5Niagara粒子特效学习(使用UE5.1,适合新手)

目录 创建空模板 创建粒子 粒子的基础属性 粒子的生命周期 颜色 大小设置 生成的位置 Skeletal Mesh Location的效果&#xff1a; Shape Location 添加速度 添加Noise力场 在生成中添加&#xff1a; 效果&#xff1a; ​编辑 在更新中添加&#xff1a; 效果&…

CSS变形与动画(三):animation帧动画详解(用法 + 四个例子)

文章目录 animation 帧动画使用定义例子1 字母例子2 水滴例子3 会动的边框例子4 旋转木马 animation 帧动画 定义好后作用于需要变化的标签上。 使用 animation-name 设置动画名称 animation-duration: 设置动画的持续时间 animation-timing-function 设置动画渐变速度 anim…

[C++] 迭代器失效示例

迭代器失效&#xff1a; 如果迭代器失效&#xff0c;那么就不能再使用这个迭代器。 如果使用&#xff0c;那么结果是未定义的。 我们以模拟实现vector的insert为例。 一、野指针 1、insert实现 这里的pos会变成野指针。 当扩完容后&#xff0c;由于空间的改变&#xff0…

Docker 网络之 ipvlan 和 macvlan

Docker ipvlan 和 macvlan 引言 本文讲解了Docker 网络模式中的 ipvlan 和 macvlan 的区别,目前自己在生产环境中使用的 ipvlan 模式非常问题.也解决了实际业务问题. IPvlan L2 mode example ipvlan 无需网卡混杂模式 , 运行如下命令后可以生成一个 vlan 子接口 , 会和主网…

不懂瞎指挥,就会闯大祸

不懂瞎指挥&#xff0c;就会闯大祸 【安志强趣讲《孙子兵法》第12讲】 【原文】 故君之所以患于军者三&#xff1a;不知军之不可以进而谓之进&#xff0c;不知军之不可以退而谓之退&#xff0c;是谓縻军&#xff1b; 【注释】 患&#xff0c;危害、贻害。 縻&#xff08;m&…

算法通关村第十关 | 归并排序

1. 归并排序原理 归并排序&#xff08;MERARE-SORT&#xff09;简单来说就是将大的序列先视为若干个比较小的数组&#xff0c;分成比较小的结构&#xff0c;然后是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治策略&#xff08;分就是将问题分成一些小的问题分…

【Unity每日一记】计时器——各种方法的实现

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

如何使用CSS实现一个响应式图片网格布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现响应式图片网格布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴…

【ARM】Day5 uart总线, LED点亮实验(C语言实现)

1. 思维导图 2. LED点灯实验&#xff08;C语言实现&#xff09; gpio.h #ifndef _LED_H__ //防止头文件重复包含_ #define _LED_H__//RCC_MP_AHB4ENSETR寄存器封装 #define RCC_MP_AHB4ENSETR (*(volatile unsigned int*)0x50000A28)//GPIO使用封装结构体 typedef struct{v…

postgresql 分组

postgresql 数据汇总 分组汇总聚合函数注意 总结 分组统计总结 高级分组总结 分组汇总 聚合函数 聚合函数&#xff08;aggregate function&#xff09;针对一组数据行进行运算&#xff0c;并且返回单个结果。PostgreSQL 支持以下常见的聚合函数&#xff1a; • AVG - 计算一…

LLM - 大模型评估指标之 ROUGE

目录 一.引言 二.ROUGE-简介 1.ROUGE-N 2.ROUGE-L 3.ROUGE-W 4.ROUGE-S 三.ROUGE-实现 1.How To Use 2.Inputs 3.Outputs 四.总结 一.引言 ROUGE 代表面向召回的研究&#xff0c;用于 Gisting 评估。它包括通过将摘要与人类创建的其他摘要进行比较来自动确定摘要质…

BC108 矩阵交换

描述 KiKi有一个矩阵&#xff0c;他想知道经过k次行变换或列变换后得到的矩阵。请编程帮他解答。 输入描述 第一行包含两个整数n和m&#xff0c;表示一个矩阵包含n行m列&#xff0c;用空格分隔。 (1≤n≤10,1≤m≤10) 从2到n1行&#xff0c;每行输入m个整数&#xff08;范围-…

【Linux操作系统】深入探索Linux进程:创建、共享与管理

进程的创建是Linux系统编程中的重要概念之一。在本节中&#xff0c;我们将介绍进程的创建、获取进程ID和父进程ID、进程共享、exec函数族、wait和waitpid等相关内容。 文章目录 1. 进程的创建1.1 函数原型和返回值1.2 函数示例 2. 获取进程ID和父进程ID2.1 函数原型和返回值2.…

消息中间件-kafka实战-第六章-kafka加线程池多线程消费

目录 参考架构图延时队列 参考 头条面试&#xff1a;当线上Kafka集群有大量消息积压时&#xff0c;如何利用多线程消费解决消费积压问题 架构图 延时队列

Python查找交作业人数

写在前面&#xff1a; 利用Python实现交作业具体情况&#xff0c;能够高效快捷地收集作业&#xff01; 一、问题&#xff1a;获取test文件夹下的所有文件 二、Python中os.listdir()函数的用法 &#xff08;一&#xff09;os.listdir()函数的基本用法 os.listdir()函数的基本…

linux系统中的中文显示问题

经常遇到这种情况&#xff1a;某些项目的文件中不可避免地包含有中文&#xff0c;在Windows系统中没有任何问题&#xff0c;拷到Linux系统中就出问题了。 1. Linux系统设置 $echo $LANG en_US.iso885915 朋友建议我设置为&#xff1a; export LANGzh_CN.utf8 但我这样设置之…

CSS中的z-index属性有什么作用?如何控制元素在层叠上下文中的显示顺序?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ z-index 属性的作用及控制元素层叠顺序作用 ⭐ 控制元素层叠顺序⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff0…

什么是flexbox布局?它有什么特点和优势?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是 Flexbox 布局&#xff1f;⭐ 特点和优势⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那…