Vue 动态连接线

Posted lee576

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue 动态连接线相关的知识,希望对你有一定的参考价值。

尝试了两个连线库 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.widthpx`,
          height: `$event.rect.heightpx`,
          transform: `translate($xpx, $ypx)`,
        );
        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>

以上是关于Vue 动态连接线的主要内容,如果未能解决你的问题,请参考以下文章

Vue JS 0.12 动态组件

vue-router 动态导航 router-link :to属性

创建基于按钮单击事件动态创建的 Konvajs 形状和连接

vue动态修改class

vue动态加载视频问题

vue-动态路由的实现