当前位置:   article > 正文

vue使用jsplumb 流程图

jsplumb
  1. 安装jsPlumb库:在Vue项目中使用npm或yarn安装jsPlumb库。

npm install jsplumb

  1. 创建一个Vue组件:创建一个Vue组件来容纳jsPlumb的功能和呈现。
  1. <template>
  2. <div style="margin: 20px">
  3. <div style="margin: 20px">
  4. <el-button type="primary" size="mini" @click="clearCanvas()"
  5. >清除连线</el-button
  6. >
  7. <el-button type="primary" size="mini" @click="startCanvas()"
  8. >绘制</el-button
  9. >
  10. </div>
  11. <div class="liucFlex" id="flowContainer">
  12. <div class="left">
  13. <div
  14. @click="clickTitle(item)"
  15. class="boxLiu"
  16. v-for="(item, index) in aItem"
  17. :key="index"
  18. >
  19. <div class="word" :class="{ isClick: activeName == item.id }">
  20. <div><i class="el-icon-view iconRight"></i>{{ item.name }}</div>
  21. <div class="date">{{ item.date }}</div>
  22. </div>
  23. <div class="status" :class="item.status" :id="item.id"></div>
  24. </div>
  25. </div>
  26. <div class="right">
  27. <div
  28. class="boxLiu"
  29. @click="clickTitle(item)"
  30. v-for="(item, index) in bItem"
  31. :key="index"
  32. >
  33. <div class="status" :class="item.status" :id="item.id"></div>
  34. <div class="word" :class="{ isClick: activeName == item.id }">
  35. <div>{{ item.name }}<i class="el-icon-view iconRight"></i></div>
  36. <div class="date">{{ item.date }}</div>
  37. </div>
  38. </div>
  39. </div>
  40. </div>
  41. </div>
  42. </template>
  43. <script>
  44. import { jsPlumb } from "jsplumb";
  45. export default {
  46. name: "table4",
  47. props: {},
  48. components: {},
  49. data() {
  50. return {
  51. // status: 表示连接线状态;error:红色,success:绿色,info:灰色
  52. aItem: [
  53. {
  54. name: "a节点1",
  55. date: "2023-01-01 20:46",
  56. id: "1",
  57. status: "error",
  58. },
  59. {
  60. name: "a节点2",
  61. date: "2023-01-01 20:46",
  62. id: "2",
  63. status: "success",
  64. },
  65. {
  66. name: "a节点3",
  67. date: "2023-01-01 20:46",
  68. id: "3",
  69. status: "success",
  70. },
  71. {
  72. name: "a节点4",
  73. date: "2023-01-01 20:46",
  74. id: "4",
  75. status: "success",
  76. },
  77. {
  78. name: "a节点5",
  79. id: "5",
  80. status: "info",
  81. },
  82. {
  83. name: "a节点6",
  84. id: "6",
  85. },
  86. {
  87. name: "a节点7",
  88. date: "2023-01-01 20:46",
  89. id: "7",
  90. status: "success",
  91. },
  92. ],
  93. bItem: [
  94. {
  95. name: "b节点1",
  96. date: "2023-01-01 20:46",
  97. id: "11",
  98. status: "error",
  99. },
  100. {
  101. name: "b节点2",
  102. date: "2023-01-01 20:46",
  103. id: "12",
  104. status: "error",
  105. },
  106. {
  107. name: "b节点3",
  108. id: "13",
  109. },
  110. {
  111. name: "b节点4",
  112. date: "2023-01-01 20:46",
  113. id: "14",
  114. status: "success",
  115. },
  116. {
  117. name: "b节点5",
  118. date: "2023-01-01 20:46",
  119. id: "15",
  120. status: "success",
  121. },
  122. {
  123. name: "b节点6",
  124. id: "16",
  125. },
  126. {
  127. name: "b节点7",
  128. id: "17",
  129. },
  130. ],
  131. plumbIns: null, // 折线初始化的对象
  132. activeName: null, // 当前选中高亮的id
  133. // 步骤图的默认配置
  134. defaultConfig: {
  135. // 对应上述基本概念
  136. anchor: ["TopCenter",[0.5, 1, 0, 0]],
  137. connector: ["Flowchart", { cornerRadius: 0, width: 1, curviness: 50 }],
  138. endpoint: "Blank",
  139. // 添加样式
  140. paintStyle: { stroke: "#E0E3EA", strokeWidth: 1, curviness: 100 }, // connector
  141. // 添加 overlay,如箭头
  142. overlays: [["Arrow", { width: 5, length: 5, location: 1 }]], // overlay
  143. },
  144. };
  145. },
  146. computed: {},
  147. watch: {},
  148. created() {},
  149. mounted() {
  150. this.setPlumbIns();
  151. },
  152. activated() {
  153. // this.setPlumbIns();
  154. },
  155. // 路由切换的时候一定要重置setPlumbIns,防止保留上次绘制的线
  156. deactivated() {
  157. this.clearCanvas();
  158. },
  159. beforeDestroy() {
  160. this.clearCanvas();
  161. },
  162. methods: {
  163. // 点击清除连线
  164. clearCanvas() {
  165. if (this.plumbIns) this.plumbIns?.reset();
  166. },
  167. // 绘制连线
  168. startCanvas() {
  169. this.setPlumbIns();
  170. },
  171. // 点击切换事件
  172. clickTitle(item) {
  173. this.activeName = item.id;
  174. },
  175. // 初始化连线
  176. setPlumbIns() {
  177. if (!this.plumbIns)
  178. // 一定要指定连接线的绘制容器,该容器为设置的盒子dom的id值,要给这个css盒子设置一个position:relative属性,不然连线的位置不对,会偏移的很严重,如果不设置将以body容器进行绘制
  179. this.plumbIns = jsPlumb.getInstance({
  180. Container: "flowContainer",
  181. });
  182. let relations = [];
  183. // 将新数组转换成所需格式
  184. for (let i = 0; i < this.aItem.length - 1; i++) {
  185. relations.push([this.aItem[i].id, this.aItem[i + 1].id]);
  186. }
  187. // 获取right的数组
  188. for (let i = 0; i < this.bItem.length - 1; i++) {
  189. relations.push([this.bItem[i].id, this.bItem[i + 1].id]);
  190. }
  191. let aTob = [];
  192. // left和right节点相接的地方
  193. aTob.push(["4", "11"]);
  194. aTob.push(["15", "7"]);
  195. this.plumbIns.ready(() => {
  196. // 默认连线
  197. for (let item of relations) {
  198. this.plumbIns.connect(
  199. {
  200. source: item[0],
  201. target: item[1],
  202. },
  203. this.defaultConfig
  204. );
  205. }
  206. // a和b相交的连线
  207. let aTobConfig = JSON.parse(JSON.stringify(this.defaultConfig));
  208. // 设置a与b节点连接线的方式
  209. aTobConfig.anchor = ["Left", "Right"];
  210. for (let item of aTob) {
  211. this.plumbIns.connect(
  212. {
  213. source: item[0],
  214. target: item[1],
  215. },
  216. aTobConfig
  217. );
  218. }
  219. });
  220. },
  221. },
  222. };
  223. </script>
  224. <style lang="scss" scoped>
  225. .liucFlex {
  226. display: flex;
  227. width: 500px;
  228. color: #101010;
  229. font-size: 14px;
  230. position: relative;
  231. .word {
  232. width: 110px;
  233. height: 50px;
  234. cursor: pointer;
  235. }
  236. .isClick {
  237. color: #409eff !important;
  238. }
  239. .right,
  240. .left {
  241. flex: 1;
  242. margin: 0 10px;
  243. }
  244. .right {
  245. .iconRight {
  246. margin-left: 5px;
  247. }
  248. .status {
  249. margin-right: 10px;
  250. }
  251. }
  252. .left {
  253. .iconRight {
  254. margin-right: 5px;
  255. }
  256. .status {
  257. margin-left: 10px;
  258. }
  259. .boxLiu {
  260. text-align: right;
  261. }
  262. }
  263. .boxLiu {
  264. display: flex;
  265. margin-bottom: 20px;
  266. }
  267. .status {
  268. width: 10px;
  269. height: 10px;
  270. border-radius: 50%;
  271. background-color: #e0e3ea;
  272. vertical-align: top;
  273. margin-top: 3px;
  274. }
  275. .date {
  276. font-size: 12px;
  277. margin-top: 10px;
  278. color: #d0d3d9;
  279. }
  280. .error {
  281. background-color: #f56c6c !important;
  282. }
  283. .success {
  284. background-color: #7ac756 !important;
  285. }
  286. .info {
  287. background-color: #e0e3ea !important;
  288. }
  289. }
  290. </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实例,清除所有的连接线和端点

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/117160
推荐阅读
相关标签
  

闽ICP备14008679号