• vue2+elTree 实现右键菜单


    背景:通过树形控件筛选出子节点数据渲染列表,再操作列表。操作在繁琐,现在需要直接通过树进行操作:删除,编辑,详情等等。

    首先创建一个树

    1. ref="tree"
    2. :data="data"
    3. node-key="id"
    4. @node-expand="treeOpen"
    5. @node-collapse="treeClose"
    6. @node-contextmenu="openTreeMenu"
    7. @node-click="handleNodeClick"
    8. />

     查看 element 的官方文档 => elTree

    node-contextmenu当某一节点被鼠标右键点击时会触发该事件

    共四个参数,依次为:event、传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身

    node-click节点被点击时的回调共三个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身
    node-expand节点被展开时触发的事件    共三个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身
    node-collapse节点被关闭时触发的事件    共三个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身

    现在知道了,右键点击树的参数和事件。我们需要 data 中的 id,明确现在的需求

    首先 写好静态的菜单

    1. // html
    2. <div v-show="showTreeMenu" class="treeMenu">
    3. <div @click="treeJump">详情div>
    4. <div @click="treeEdit">编辑div>
    5. <div @click="treeMark">标记div>
    6. <div @click="treeDelete">删除div>
    7. div>
    8. // css
    9. .treeMenu{
    10. position: fixed;
    11. z-index: 99999;
    12. top: 50%;
    13. left: 50%;
    14. background-color: white;
    15. overflow: hidden;
    16. border-radius: 5px;
    17. border: 1px solid #e6ebf5;
    18. box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
    19. div{
    20. padding: 3px 20px;
    21. box-sizing: border-box;
    22. //width: 50px;
    23. text-align: center;
    24. }
    25. div:hover{
    26. background-color: #eee;
    27. cursor: pointer;
    28. }
    29. }

    :菜单默认不显示,最好不要嵌套太深,并且记得设置 z-index 避免被覆盖,其他样式根据自己需求都可以调整

    添加右键事件,拿到需要的数据,触发显示菜单

    1. openTreeMenu(event, data, node, target) {
    2. console.log(event, data, node, target)
    3. this.showTreeMenu = true // 显示菜单
    4. this.contextNode = data // 存储数据
    5. document.querySelector('.treeMenu').setAttribute('style',`top:${event.clientY}px;left:${event.clientX}px;`)
    6. document.addEventListener('click', this.closeTreeMenu)
    7. document.addEventListener('contextmenu', this.closeTreeMenu)
    8. },

    覆盖菜单样式后,添加了两个监听,用于关闭菜单。触发关闭后,及时移除监听事件

    1. closeTreeMenu() {
    2. this.showTreeMenu = false // 关闭菜单
    3. document.removeEventListener('click', this.closeTreeMenu)
    4. document.removeEventListener('contextmenu', this.closeTreeMenu)
    5. }

    现在回到上面提到的另外三个方法,需要在他们三个的事件中,关闭右键菜单,否则我们的右键菜单打开后,操作节点树,是不会触发我们写的关闭监听的。

    把菜单中的功能都加上,右键菜单完成。

     如果有更好的方法和指正欢迎讨论。

  • 相关阅读:
    7.提交任务到 NioEventLoop(Nio事件循环执行线程)
    Java中的synchronized、volatile、ThreadLocal
    【Redis系列】Linux查看Redis版本信息
    卷十一 汉纪三
    所有 WCF 超时说明
    Android kotlin自定义圆形菜单的功能实现
    AOP中5种通知的注解
    Jmeter性能 —— 事务控制器
    docker介绍和安装
    ​iOS安全加固方法及实现
  • 原文地址:https://blog.csdn.net/paidaboluo/article/details/126367105