当前位置:   article > 正文

vue2 + jsPlumb_jsplumb vue

jsplumb vue

vue+jsplumb实现连线绘图,供大家参考,具体内容如下

jsPlumb是一个比较强大的绘图组件,它提供了一种方法,主要用于连接网页上的元素。在现代浏览器中,它使用SVG或者Canvas技术,而对于IE8以下(含IE8)的浏览器,则使用VML技术。

效果如图

1.安装

npm install jsplumb --save

2.main.js 引入

  1. import jsPlumb from 'jsplumb'
  2. Vue.prototype.$jsPlumb = jsPlumb.jsPlumb

3.封装组件 linkDataJsPlumb.vue

  1. <template>
  2. <div>
  3. <div id="container" class='clear-float'>
  4. <div class="left">
  5. <ul>
  6. <div class='titleContend clear-float'>
  7. <div class='float firstField'>源表字段</div>
  8. <div class='float secondField'>类型</div>
  9. <div class='float thirdField'>描述</div>
  10. </div>
  11. <li v-for="(item,index) in leftList" :key="'left' + index" :id="item.nodeId" name="source">
  12. <div class='titleContend clear-float'>
  13. <div class='float firstField'>{{item.name}}</div>
  14. <div class='float secondField'>{{item.name}}</div>
  15. <div class='float thirdField'>{{item.name}}</div>
  16. </div>
  17. </li>
  18. </ul>
  19. </div>
  20. <div class="right">
  21. <ul>
  22. <div class='titleContend clear-float'>
  23. <div class='float firstField'>识别字段</div>
  24. </div>
  25. <li v-for="(item,index) in rightList" :key="'right' + index" :id="item.nodeId" name="target">
  26. <div class='titleContend clear-float'>
  27. <div class='float firstField'>{{item.name}}</div>
  28. </div>
  29. </li>
  30. </ul>
  31. </div>
  32. </div>
  33. </div>
  34. </template>
  35. <script>
  36. export default {
  37. name: 'linkElementModal',
  38. props: {
  39. // 左侧数据 [{ name: 'xxx_left_1', nodeId: 'left_1' }]
  40. leftList: {
  41. type: Array,
  42. default: () => {
  43. return [];
  44. }
  45. },
  46. // 右侧数据 [{ name: 'xxx_right_1', nodeId: 'right_1' }]
  47. rightList: {
  48. type: Array,
  49. default: () => {
  50. return [];
  51. }
  52. },
  53. // 默认数据 [{left: 'left_1', right: 'right_1'}]
  54. value: {
  55. type: Array,
  56. default: () => {
  57. return [];
  58. }
  59. }
  60. },
  61. data () {
  62. return {
  63. jsPlumb: null // 缓存实例化的jsplumb对象
  64. };
  65. },
  66. mounted () {
  67. this.showPlumb();
  68. },
  69. methods: {
  70. showPlumb () {
  71. this.jsPlumb = this.$jsPlumb.getInstance({
  72. Container: 'container', // 选择器id
  73. EndpointStyle: { radius: 0.11, fill: '#999' }, // 端点样式
  74. PaintStyle: { stroke: '#999', strokeWidth: 2 }, // 绘画样式,默认8px线宽 #456
  75. HoverPaintStyle: { stroke: '#994B0A', strokeWidth: 3 }, // 默认悬停样式 默认为null
  76. ConnectionOverlays: [ // 此处可以设置所有箭头的样式
  77. ['Arrow', { // 设置参数可以参考中文文档
  78. location: 1,
  79. width: 10,
  80. length: 6,
  81. paintStyle: {
  82. stroke: '#999',
  83. fill: '#999'
  84. }
  85. }]
  86. ],
  87. Connector: ['Straight'], // 要使用的默认连接器的类型:直线,折线,曲线等
  88. DrapOptions: { cursor: 'crosshair', zIndex: 2000 }
  89. });
  90. this.jsPlumb.batch(() => {
  91. for (let i = 0; i < this.leftList.length; i++) {
  92. this.initLeaf(this.leftList[i].nodeId, 'source');
  93. }
  94. for (let j = 0; j < this.rightList.length; j++) {
  95. this.initLeaf(this.rightList[j].nodeId, 'target');
  96. }
  97. });
  98. this.setjsPlumb(true, true);
  99. // 点击连线
  100. this.jsPlumb.bind('click', (conn, originalEvent) => {
  101. this.value.forEach((item, index) => {
  102. if (item.left == conn.sourceId) {
  103. this.value.splice(index, 1);
  104. }
  105. });
  106. this.jsPlumb.deleteConnection(conn);
  107. });
  108. // 连线时触发
  109. this.jsPlumb.bind('connection', (conn, originalEvent) => {
  110. let obg = {
  111. left: conn.sourceId,
  112. right: conn.targetId
  113. };
  114. this.value.push(obg);
  115. });
  116. // 右键触发
  117. this.jsPlumb.bind('contextmenu', (conn, originalEvent) => {
  118. console.log(conn, originalEvent);
  119. });
  120. },
  121. // 初始化规则使其可以连线、拖拽
  122. initLeaf (id, type) {
  123. const ins = this.jsPlumb;
  124. const elem = document.getElementById(id);
  125. if (type === 'source') {
  126. ins.makeSource(elem, {
  127. anchor: [1, 0.5, 0, 0], // 左 上 右 下
  128. allowLoopback: false, // 允许回连
  129. maxConnections: 1 // 最大连接数(-1表示不限制)
  130. });
  131. } else {
  132. ins.makeTarget(elem, {
  133. anchor: [0, 0.5, 0, 0],
  134. allowLoopback: false,
  135. maxConnections: 1
  136. });
  137. }
  138. },
  139. setjsPlumb (sourceFlag, targetFlag) {
  140. const source = document.getElementsByName('source');
  141. const target = document.getElementsByName('target');
  142. this.jsPlumb.setSourceEnabled(source, sourceFlag);
  143. this.jsPlumb.setTargetEnabled(target, targetFlag);
  144. this.jsPlumb.setDraggable(source, false); // 是否支持拖拽
  145. this.jsPlumb.setDraggable(target, false); // 是否支持拖拽
  146. // 是否含有默认数据
  147. if (this.value.length > 0) {
  148. this.initConnect();
  149. }
  150. },
  151. // 默认链接
  152. initConnect () {
  153. const jsplumbConnectOptions = {
  154. isSource: true,
  155. isTarget: true,
  156. // 动态锚点、提供了4个方向 Continuous、AutoDefault
  157. anchor: 'Continuous'
  158. };
  159. this.jsPlumb.deleteEveryConnection();
  160. for (var i = 0; i < this.value.length; i++) {
  161. let line = this.value[i];
  162. this.jsPlumb.connect({
  163. source: line.left,
  164. target: line.right
  165. }, jsplumbConnectOptions);
  166. }
  167. }
  168. }
  169. };
  170. </script>
  171. <style>
  172. #container {
  173. width: 500px;
  174. padding: 20px;
  175. position: relative; /*一定加上这句,否则连线位置发生错乱*/
  176. }
  177. .left {
  178. float: left;
  179. width: auto;
  180. }
  181. .right {
  182. float: right;
  183. width: auto;
  184. }
  185. .left li,
  186. .right li {
  187. list-style: none;
  188. width: auto;
  189. }
  190. </style>
  191. <style lang='scss' scoped>
  192. .titleContend {
  193. width: auto;
  194. height: 30px;
  195. line-height: 30px;
  196. border-bottom: 1px solid #cccccc;
  197. .float {
  198. float: left;
  199. }
  200. .firstField {
  201. width: 100px;
  202. }
  203. .secondField {
  204. width: 100px;
  205. }
  206. .thirdField {
  207. width: 80px;
  208. }
  209. }
  210. </style>

4.使用组件 

  1. <linkDataJsPlumb v-model='defaultList' :leftList='leftList' :rightList='rightList'/>
  2. import linkDataJsPlumb from './components/linkDataJsPlumb';
  3. // 左侧数据
  4. leftList: [
  5. { name: 'xxx_left_1', nodeId: 'left_1' },
  6. { name: 'xxx_left_2', nodeId: 'left_2' },
  7. { name: 'xxx_left_3', nodeId: 'left_3' },
  8. { name: 'xxx_left_4', nodeId: 'left_4' }
  9. ],
  10. rightList: [
  11. { name: 'xxx_right_1', nodeId: 'right_1' },
  12. { name: 'xxx_right_2', nodeId: 'right_2' },
  13. { name: 'xxx_right_3', nodeId: 'right_3' },
  14. { name: 'xxx_right_4', nodeId: 'right_4' }
  15. ],
  16. // 默认值
  17. defaultList: [
  18. {left: 'left_1', right: 'right_2'},
  19. {left: 'left_2', right: 'right_3'},
  20. {left: 'left_3', right: 'right_1'}
  21. ]

博客前端开发 | NoteZ_技术博客

中文mirrors / wangduanduan / jsplumb-chinese-tutorial · GitCode

jsPlumb的初始化

使用jsPlumb进行实例化的同时可以传入相关属性的设置。

  1. this.jsp = jsPlumb.getInstance({
  2. Anchor: ["Right", "Left"],
  3. //锚点位置,如left,top,bottom等;对任何没有声明描点的Endpoint设置锚点,
  4. //用于source或target节点
  5. //设置为数组可以指定锚点的位置
  6. Anchors: ["Right", "Left"], //连线的source和target Anchor
  7. ConnectionsDetachable: false, //连线是否可用鼠标分离
  8. ConnectionOverlays: [ //连线的叠加组件,如箭头、标签
  9. //叠加组件-箭头参数设置
  10. ["Arrow", {
  11. location: 1,
  12. visible: true,
  13. width: 11,
  14. length: 11,
  15. id: "ARROW",
  16. events: {
  17. click: function () {
  18. }
  19. }
  20. }],
  21. //叠加组件-标签参数设置
  22. ["Label", {
  23. location: 0.1,
  24. cssClass: "aLabel", //hover时label的样式名
  25. events: {
  26. click:info=>{
  27. console.log(info);
  28. }
  29. },
  30. visible: true
  31. }]
  32. ],
  33. Connector: "Straight",
  34. //连线的类型,有直线(Sright),有流程图(Flowchart)、贝塞尔曲线(Bezier),State machine(状态机)
  35. Container: "module",
  36. //父级元素id;假如页面元素所在上层不同,最外层父级一定要设置
  37. DoNotThrowErrors: false,
  38. //如果请求不存在的Anchor、Endpoint或Connector,是否抛异常
  39. DragOptions : { },//用于配置拖拽元素的参数
  40. DropOptions : { },//用于配置元素的drop行为的参数
  41. Endpoint: "Dot", //端点(锚点)的样式声明
  42. Endpoints: [null, null],
  43. //用jsPlumb.connect创建连接时,source端点和target端点的样式设置
  44. EndpointOverlays: [], //端点的叠加物
  45. EndpointStyle: {fill: 'transparent', stroke: '#1565C0', radius: 4, strokeWidth: 1}, //端点的默认样式
  46. EndpointStyles: [null, null], //连线的source和target端点的样式
  47. EndpointHoverStyle: {fill: '#1565C0', stroke: '#1565C0', radius: 4, strokeWidth: 1}, //端点hover时的样式
  48. EndpointHoverStyles: [null, null], //连线的source和target端点hover时的样式
  49. HoverPaintStyle: {stroke: '#1565C0', strokeWidth: 3}, //连线hover时的样式
  50. LabelStyle: {color: "black"}, //标签的默认样式,用css写法。
  51. LogEnabled: false, //是否开启jsPlumb内部日志
  52. Overlays: [], //连线和端点的叠加物
  53. MaxConnections: 10, //端点支持的最大连接数
  54. PaintStyle: {stroke: '#1565C0', strokeWidth: 1, joinstyle: 'round'}, //连线样式
  55. ReattachConnections: true, //是否重新连接使用鼠标分离的线?
  56. RenderMode: "svg", //默认渲染模式
  57. Scope: "jsPlumb_DefaultScope", //范围,具有相同scope的点才可
  58. reattach: true,
  59. })

jsPlumb的相关方法

  • 添加连线

  1. let params={source: info.sourceId, target: info.targetId};
  2. let setting=为自定义的jsPlumb设置,也可以不传入
  3. this.jsp.connect(params,setting);
  • 删除连线

this.jsp.removeAllEndpoints(node)这个方法删除指定的节点和连线,传入的node为节点元素
this.jsp.deleteEveryConnection();这个方法删除所有连线,不需要传入参数      
this.jsp.deleteEveryEndpoint();这个方法删除所有节点,不需要传入参数
this.jsp.deleteConnectionsForElement("A-1",{});删除制定的连线,传入节点ID
  • 重绘连线

  1. this.jsp.repaintEverything()//重绘连线
  2. this.jsp.setSuspendDrawing(true);
  3. this.jsp.setSuspendDrawing(false,true);
  4. 这里第二个参数的true,会使整个jsPlumb立即重绘。

注意:

 因为jsPlumb 是通过DOM进行工作的,所以我们需要把jsPlumb初始化 放在mounted声明,
如果是在子组件中完成,需要保证子组件渲染完成才可进行处理,可以放在进行初始化this.$nextTick(()=>{  } )

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

闽ICP备14008679号