Element UI中el-tree 添加右键菜单的方法,附带问题和解决方案

1 篇文章 0 订阅
1 篇文章 0 订阅

1、在el-tree 中添加方法 @node-contextmenu="rightClick"

   <el-tree :data="data" 
:props="defaultProps"
 @node-contextmenu="rightClick" 
@node-click="treeNodeClick">
</el-tree>

2、建立一个右键组件,可以使用 el-menu 组件,优点是,可以借助el-menu 的 selec方法进行增删改查以及样式不用手写了,弊端是不容易获取点击的Dom,先暂时这样写吧

          <!-- 树形控件右键组件 -->
          <div v-show="menuShow" class="tree_rightmenu" :style="{ ...rightMenu }">
            
              <el-menu class="el-menu-vertical-demo" @select="selectMenuNode" >

                <el-menu-item id="menuitem" index="1" style="font-size: 12px;">
                  <span slot="title">新增课时</span>
                </el-menu-item>
                <el-menu-item index="2" style="font-size: 12px;">
                  <span slot="title">删 除</span>
                </el-menu-item>
              </el-menu>
          </div>

3、methods中的写法

  rightClick(e, data, node) {
      this.menuShow = false // 先把模态框关死,目的是 第二次或者第n次右键鼠标的时候 它默认的是true
      this.menuShow = true
      e.preventDefault() //关闭浏览器右键默认事件
      this.rightMenu = { top: e.pageY + 'px', left: e.pageX + 'px' }
      document.addEventListener('click',(ev)=>{
        // ev.stopImmediatePropagation()
        if(ev.target!==document.querySelector('.el-menu-item.is-active')){ 
          this.foo() 
        }
      })

    },
    foo() {
      // 取消鼠标监听事件 菜单栏
      this.menuShow = false
      document.removeEventListener('click', this.foo) // 关掉监听,
    },

3、点击树状节点时,关闭右键组件

  treeNodeClick(){
      this.foo() 
    },

4、css样式

.tree_rightmenu {
  position: fixed;
  width: 120px;
  border: 1px solid rgba(0, 0, 0, 0.15);
  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
  z-index: 1000;
}

5、最终效果

存在问题:在右键弹出的组件中,点击右键,会默认弹出浏览器的右键菜单栏;

想到的解决办法是,点击该节点时,使用原生js的 contextmenu 事件,在事件中用 e.preventDefault()方法进行阻止

最后建议使用vue右键插件 vue-contextmenujs

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值