vue拖拽vue-draggable

<template>
  <div class="flow-menu" ref="tool">
    <div v-for="menu  in  menuList" :key="menu.id">
      <span class="ef-node-pmenu" @click="menu.open = !menu.open">
        <a-icon :type="menu.open ? ‘caret-down‘ : ‘caret-right‘"></a-icon>
        &nbsp;{{menu.name}}
      </span>
      <ul v-show="menu.open" class="ef-node-menu-ul">
        <draggable @end="end" @start="move" :v-bind="draggableOptions">
          <li
            v-for="subMenu in menu.children"
            class="ef-node-menu-li"
            :key="subMenu.id"
            :type="subMenu.unique"
          >
            <a-icon :type="subMenu.ico" style="paddingRight: 8px" :style="{ color: subMenu.icoColor }"></a-icon>
            {{subMenu.name}}
          </li>
        </draggable>
      </ul>
    </div>
  </div>
</template>
<script>
import draggable from vuedraggable
import lodash from lodash
import nodeType from ./nodeType

const mousePosition = {
  left: -1,
  top: -1
}

export default {
  data() {
    return {
      activeNames: 1,
      // draggable配置参数参考 https://www.cnblogs.com/weixin186/p/10108679.html
      draggableOptions: {
        preventOnFilter: false,
        sort: false,
        disabled: false,
        ghostClass: tt,
        // 不使用H5原生的配置
        forceFallback: true
        // 拖拽的时候样式
        // fallbackClass: ‘flow-node-draggable‘
      },
      // 默认打开的左侧菜单的id
      defaultOpeneds: [1, 2],
      menuList: lodash.cloneDeep(nodeType),
      nodeMenu: {}
    }
  },
  components: {
    draggable
  },
  created() {
    /**
     * 以下是为了解决在火狐浏览器上推拽时弹出tab页到搜索问题
     * @param event
     */
    if (this.isFirefox()) {
      document.body.ondrop = function(event) {
        // 解决火狐浏览器无法获取鼠标拖拽结束的坐标问题
        mousePosition.left = event.layerX
        mousePosition.top = event.clientY - 50
        event.preventDefault()
        event.stopPropagation()
      }
    }
  },
  methods: {
    // 根据类型获取左侧菜单对象
    getMenuByType(unique) {
      for (let i = 0; i < this.menuList.length; i++) {
        const children = this.menuList[i].children
        for (let j = 0; j < children.length; j++) {
          if (children[j].unique === unique) {
            return children[j]
          }
        }
      }
    },
    // 拖拽开始时触发
    move(evt, a, b, c) {
      var unique = evt.item.attributes.type.nodeValue
      this.nodeMenu = this.getMenuByType(unique)
    },
    // 拖拽结束时触发
    end(evt, e) {
      this.$emit(addNode, evt, this.nodeMenu, mousePosition)
    },
    // 是否是火狐浏览器
    isFirefox() {
      var userAgent = navigator.userAgent
      if (userAgent.indexOf(Firefox) > -1) {
        return true
      }
      return false
    }
  }
}
</script>
<style scoped>
.flow-menu {
  user-select: none;
}
</style>

https://www.jianshu.com/p/e8ff1e1cafb1   参考地址

vue拖拽vue-draggable

上一篇:Trie专题练习记录 1


下一篇:元类,对象实列化的过程__new__ 和 __init__