效果图:

 

精髓代码:

父组件:

      树形结构加自定义菜单

                  <div class="treesclass">
                    <my-tree
                      :data="theData"
                      :name="menuName"
                      :loading="loading"
                      @getSubMenu="getSubMenu"
                    ></my-tree>
                  </div>
                  <ul class="dropdown-menu" id="msgRightMenu">
                    <li>
                      <a id="adddepart" style="text-align:center">添加</a>
                      <!--// @click="addDepart" -->
                    </li>
                    <li>
                      <a href="#" style="text-align:center">修改</a>
                    </li>
                    <li>
                      <a href="#" style="text-align:center">删除</a>
                    </li>
                  </ul>

 

引入树体

import myTree from "./treeMenu.vue";

定义树体及数据

 data() {
    return {
      theData: myData,
      menuName: "menuName", // 显示菜单名称的属性
      loading: false
    };
  },

获取树体传输的数据

 methods: {
    //获取到 树体传来的数据
    getSubMenu(item, index) {
      alert("item" + item);
      alert("getSubMenu" + item);
   }
}

子组件:

树体信息:

<ul class="tree-menu">
    <li v-for="(item, index) in data">
      <span @click="toggle(item, index)" @contextmenu.prevent="rightBtn(item,index)">
        <i
          :class="['icon', item.children && item.children.length ? folderIconList[index] : 'file-text', loading ? loadingIconList[index] : '']"
        ></i>
        {{ item[name] || item.menuName }}
      </span>
      <tree-menu v-if="scope[index]" :data="item.children" @contextmenu.prevent="rightBtn(item)"></tree-menu>
    </li>
  </ul>

接受数据:

 props: {
    data: Array,
    name: String,
    loading: Boolean
  },

定义子组件数据:

data() {
    return {
      folderIconList: [],
      loadingIconList: [],
      scope: {},
      menuName: ""
    };
  },

定义方法:

 doTask(index) {
      this.$set(this.scope, index, !this.scope[index]);
      this.folderIconList[index] = this.scope[index] ? "folder-open" : "folder";
    },
    toggle(item, index) {
      // alert(item.menuName);

      //this.$emit("getSubMenu", item.menuName);
      this.loadingIconList = [];
      //alert(item.menuName+'   '+index);
      if (item.children && item.children.length) {
        this.doTask(index);
      } else {
        this.loadingIconList[index] = "loading";

        this.$emit("getSubMenu", item, subMenuList => {
          if (subMenuList && subMenuList.length) {
            this.doTask(index);
          }
        });
      }
    },

右击自定义菜单:

 //右击出现功能菜单
    rightBtn(item, index) {
      this.menuName = item.menuName;
      var menuname = this.menuName;
       //有问题  子节点触发外部事件
      //alert("长度" + item.id.length + "   " + item.id);
      if (item.id.length == 1) {
        this.$emit("getSubMenu", menuname);
      } else if (item.id.length == 2) {
        var that = this.$parent;
        that.$emit("getSubMenu", menuname);
      } else if (item.id.length == 3) {
        var that = this.$parent.$parent;
        that.$emit("getSubMenu", menuname);
      } else if (item.id.length == 4) {
        var that = this.$parent.$parent.$parent;
        that.$emit("getSubMenu", menuname);
      }

      //this.$parent.$emit("getSubMenu",menuname);
      let menu = document.getElementById("msgRightMenu");
      var e = e || window.event;
      var marginWidths = 400;
      var marginHeight = 110;

      //鼠标点的坐标
      var oX = e.clientX - marginWidths;
      var oY = e.clientY - marginHeight;
      if (oX > 423) {
        oX = 423;
      }
      //菜单出现后的位置
      menu.style.display = "block";
      menu.style.left = oX + 130 + "px";
      menu.style.top = oY - 50 + "px";
      document.onclick = function() {
        document.getElementById("msgRightMenu").style.display = "none";
      };

      //阻止浏览器默认事件
      return false; //一般点击右键会出现浏览器默认的右键菜单,写了这句代码就可以阻止该默认事件
    }

差不多了!OK

下载地址:https://github.com/xiaomililili/rightContext

Logo

前往低代码交流专区

更多推荐