el-tree 自定义右键事件

<template slot="leftTree">
  <el-tree 
   class="filter-tree"
   :data="treeList"
   highlight-current
   :default-expanded-keys="expandedKeys"
   :props="defaultProps"
   node-key="label"
   ref="tree"
   @node-click="handleNodeClick">
     <span class="custom-tree-node" slot-scope="{ node, data }">
       <template>
         <p @contextmenu.prevent="openMenu($event,node)" style="width:100%">
           <span>{{data.label}}</span>
         </p>
         <ul
          v-show="visible"
          :style="{ left: left + 'px', top: top + 'px' }"
          class="contextmenu">
           <li class="contextmenuli" v-for="(item,index) in liDataList" :key="index">
            <img :src="item.src" alt="" srcset="">
            <button :disabled="item.disabled" class="contextmenubtn">{{item.label}}</button>
           </li>
         </ul>
       </template>
     </span>
  </el-tree>
</template>

 

<script>
    data(){
        return{
            // 测试
            visible: false,
            top: 0,
            left: 0,
            // 菜单
            liDataList:[
                {
                  src:require('@/assets/image/sql.png'),
                  label:'查询',
                  disabled:false
                },
                {
                  src:require('@/assets/image/design.png'),
                  label:'设计表',
                  disabled:false
                },
                {
                  src:require('@/assets/image/create.png'),
                  label:'新建表',
                  disabled:false
                },
                {
                  src:require('@/assets/image/design.png'),
                  label:'Insert编辑',
                  disabled:false
                },
                {
                  src:require('@/assets/image/update.png'),
                  label:'刷新',
                  disabled:false
                },
                {
                  src:require('@/assets/image/extend.png'),
                  label:'属性',
                  disabled:false
                }
            ]
        }
    },
    watch: {
        //   监听属性对象,newValue为新的值,也就是改变后的值
        visible(newValue, oldValue) {
          if (newValue) {
            //菜单显示的时候
            // document.body.addEventListener,document.body.removeEventListener它们都接受3个参数
            // ("事件名" , "事件处理函数" , "布尔值");
            // 在body上添加事件处理程序
            document.body.addEventListener("click", this.closeMenu);
          } else {
            //菜单隐藏的时候
            // 移除body上添加的事件处理程序
            document.body.removeEventListener("click", this.closeMenu);
          }
        }
     },
    methods: {
        //右击
    openMenu(e,node) {
          var x = e.pageX; //这个应该是相对于整个浏览器页面的x坐标,左上角为坐标原点(0,0)
          var y = e.pageY; //这个应该是相对于整个浏览器页面的y坐标,左上角为坐标原点(0,0)
          this.top = y;
          this.left = x;
          this.visible = true;//显示菜单
          this.liDataList.forEach((i,index)=>{
            if(e.srcElement.innerText==='Tables'){
              if(i.label !=='查询' && i.label!=='新建表' && i.label!=='刷新'){
                this.liDataList[index].disabled = true
              }else {
                this.liDataList[index].disabled = false
              }
            }else if(e.srcElement.innerText==='Views'){
              if(i.label !=='查询' && i.label!=='刷新'){
                this.liDataList[index].disabled = true
              }else {
                this.liDataList[index].disabled = false
              }
            }else if(node.parent.data.label === 'Tables'){
              if(i.label==='刷新'){
                this.liDataList[index].disabled = true
              }else {
                this.liDataList[index].disabled = false
              }
            }else if(node.parent.data.label === 'Views'){
              if(i.label!=='查询'){
                this.liDataList[index].disabled = true
              }else {
                this.liDataList[index].disabled = false
              }
            }
          })
        },
        //关闭菜单
        closeMenu() {
          this.visible = false; //关闭菜单
        },
    }
</script>
.filter-tree{
  /deep/ .el-tree-node__children{
    max-height: 500px;
    overflow-y: auto;
  }
  /deep/ .el-tree-node__content{
    width: 100%;
  }
  /deep/ .custom-tree-node{
      width: 100%;
  }
}
.contextmenu {
  width: 108px;
  margin: 0;
  background: #fff;
  z-index: 3000;
  position: fixed; //关键样式设置固定定位
  list-style-type: none;
  padding: 5px 0;
  border-radius: 4px;
  font-size: 12px;
  font-weight: 400;
  color: #333;
}

.contextmenu li {
  width: 100%;
  margin: 0;
  padding: 7px 16px;
  cursor: default;
  border-bottom: 1px solid #ededed;
  img{
    width:18px;height:16px;margin-right: 7px;float: left;
  }
  .contextmenubtn{
    width: 100%;
    text-align: left;
    border: none;
  }
  &:hover{
    background: #a5a5a542;
  }
}

效果图

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值