首页 > 其他分享 >vue2中el-tree组件实现右键菜单功能

vue2中el-tree组件实现右键菜单功能

时间:2024-02-05 16:45:17浏览次数:32  
标签:el console name tree children 右键 节点 data id

目标

右键点击树组件中的节点,弹出增删改的菜单,要求菜单总是在点击位置的附近

先添加一个树

<template>
    <div>
        <el-tree
            <!-- 绑定数据 -->
            :data="tree"
            highlight-current
            node-key="id"
            :props="{
                children: 'children',
                label: 'name'
            }"
            ref="tree"
        >
        </el-tree>
    </div>
</template>

添加数据

export default {
    data() {
        return {
            tree: [
                {
                    id: 1,
                    name: '北京',
                    children: [
                        {
                            id: 5,
                            name: '朝阳',
                            children: [
                                {
                                    id: 17,
                                    name: '双塔',
                                    children: []
                                },
                                {
                                    id: 18,
                                    name: '龙城',
                                    children: []
                                }
                            ]
                        },
                        {
                            id: 6,
                            name: '丰台',
                            children: [
                                {
                                    id: 19,
                                    name: '新村',
                                    children: []
                                },
                                {
                                    id: 20,
                                    name: '大红门',
                                    children: []
                                },
                                {
                                    id: 21,
                                    name: '长辛店',
                                    children: [
                                        {
                                            id: 22,
                                            name: '东山坡',
                                            children: []
                                        },
                                        {
                                            id: 23,
                                            name: '北关',
                                            children: []
                                        },
                                        {
                                            id: 24,
                                            name: '光明里',
                                            children: []
                                        },
                                        {
                                            id: 25,
                                            name: '赵辛店',
                                            children: []
                                        },
                                        {
                                            id: 26,
                                            name: '西峰寺',
                                            children: []
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            id: 7,
                            name: '海淀',
                            children: []
                        },
                        {
                            id: 8,
                            name: '房山',
                            children: []
                        },
                        {
                            id: 10,
                            name: '顺义',
                            children: []
                        }
                    ]
                },
                {
                    id: 2,
                    name: '上海',
                    children: [
                        {
                            id: 11,
                            name: '黄埔',
                            children: []
                        },
                        {
                            id: 12,
                            name: '徐汇',
                            children: []
                        }
                    ]
                },
                {
                    id: 3,
                    name: '广州',
                    children: [
                        {
                            id: 13,
                            name: '荔湾',
                            children: []
                        },
                        {
                            id: 14,
                            name: '白云',
                            children: []
                        },
                        {
                            id: 15,
                            name: '越秀',
                            children: []
                        },
                        {
                            id: 16,
                            name: '南沙',
                            children: []
                        }
                    ]
                }
            ]
        }
    }
}

具体效果

添加右键菜单

组件的官网

https://element.eleme.cn/#/zh-CN/component/tree

事件 解析 参数
node-contextmenu 当某一节点被鼠标右键点击时会触发该事件 共四个参数,依次为:event、传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身
node-click 节点被点击时的回调 共三个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身
node-expand 节点被展开时触发的事件 共三个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身
node-collapse 节点被关闭时触发的事件 共三个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身

添加菜单部分的页面

<div v-show="showTreeMenu" class="treeMenu">
     <div @click="addOrg">
          <i class="el-icon-plus" style="color: #1e9fff"></i>
              增加子分组
     </div>
     <div @click="editOrg">
          <i class="el-icon-edit" style="color: #fcc465"></i>
              修改分组名称
     </div>
     <div @click="deleteOrg">
          <i class="el-icon-delete" style="color: red"></i>
              删除分组及子分组
     </div>
</div>

<style lang="less" scoped>
.treeMenu {
    font-size: 14px;
    position: fixed;
    padding: 2px 0px 5px;
    z-index: 99999; // 为了显示再最上层
    top: 50%;
    left: 50%;
    background-color: rgba(255, 255, 255, 0.9);
    overflow: hidden; // 溢出的部分隐藏
    border-radius: 5px; // 圆角
    border: 1px solid #e6ebf5;
    box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
    div {
        padding: 2px 10px;
        box-sizing: border-box;
        text-align: left;
    }
    div:hover {
        background-color: #eee;
        cursor: pointer;
    }
}
</style>

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

添加事件部分

<script>
export default {
    methods: {
        addOrg() {
            console.log('添加子分组')
        },
        editOrg() {
            console.log('修改分组名称')
        },
        deleteOrg() {
            this.$confirm(`删除 [${this.contextNode.name}] 分组、下级子分组 <br>是否继续?`, '提示', {
                dangerouslyUseHTMLString: true,
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning',
                center: true
            }).then(console.log('删除分组及下级子分组'))
        }
    }
</script>

给树组件添加事件和对应的数据

<template>
    <div>
        <el-tree
            :data="tree"
            highlight-current
            node-key="id"
            :props="{
                children: 'children',
                label: 'name'
            }"
            <!-- 添加打开节点的事件 -->
            @node-expand="openTreeNode"
            <!-- 添加关闭节点的事件 -->
            @node-collapse="closeTreeNode"
            ref="tree"
            <!-- 添加右键的事件 -->
            @node-contextmenu="openTreeMenu"
        >
        </el-tree>
    </div>
</template>

<script>
export default {
    methods: {
        openTreeMenu(event, data, node, target) {
            console.log(event, data, node, target)
            this.showTreeMenu = true // 显示菜单
            this.contextNode = data // 存储数据
            document
                .querySelector('.treeMenu')
                .setAttribute('style', `top:${event.clientY + 10}px;left:${event.clientX + 10}px;`)
            document.addEventListener('click', this.closeTreeMenu)
            document.addEventListener('contextmenu', this.closeTreeMenu)
        },
        closeTreeMenu() {
            this.showTreeMenu = false // 关闭菜单
            document.removeEventListener('click', this.closeTreeMenu)
            document.removeEventListener('contextmenu', this.closeTreeMenu)
        },
        openTreeNode(data) {
            console.log('节点被展开')
            this.showTreeMenu = false
            console.log(data)
        },
        closeTreeNode(data) {
            console.log('节点被关闭')
            this.showTreeMenu = false
            console.log(data)
        }
    },
    data() {
        return {
            showTreeMenu: false,
            contextNode: {},
            tree: [
                {
                    id: 1,
                    name: '北京',
                    children: [
                        {
                            id: 5,
                            name: '朝阳',
                            children: [
                                {
                                    id: 17,
                                    name: '双塔',
                                    children: []
                                },
                                {
                                    id: 18,
                                    name: '龙城',
                                    children: []
                                }
                            ]
                        },
                        {
                            id: 6,
                            name: '丰台',
                            children: [
                                {
                                    id: 19,
                                    name: '新村',
                                    children: []
                                },
                                {
                                    id: 20,
                                    name: '大红门',
                                    children: []
                                },
                                {
                                    id: 21,
                                    name: '长辛店',
                                    children: [
                                        {
                                            id: 22,
                                            name: '东山坡',
                                            children: []
                                        },
                                        {
                                            id: 23,
                                            name: '北关',
                                            children: []
                                        },
                                        {
                                            id: 24,
                                            name: '光明里',
                                            children: []
                                        },
                                        {
                                            id: 25,
                                            name: '赵辛店',
                                            children: []
                                        },
                                        {
                                            id: 26,
                                            name: '西峰寺',
                                            children: []
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            id: 7,
                            name: '海淀',
                            children: []
                        },
                        {
                            id: 8,
                            name: '房山',
                            children: []
                        },
                        {
                            id: 10,
                            name: '顺义',
                            children: []
                        }
                    ]
                },
                {
                    id: 2,
                    name: '上海',
                    children: [
                        {
                            id: 11,
                            name: '黄埔',
                            children: []
                        },
                        {
                            id: 12,
                            name: '徐汇',
                            children: []
                        }
                    ]
                },
                {
                    id: 3,
                    name: '广州',
                    children: [
                        {
                            id: 13,
                            name: '荔湾',
                            children: []
                        },
                        {
                            id: 14,
                            name: '白云',
                            children: []
                        },
                        {
                            id: 15,
                            name: '越秀',
                            children: []
                        },
                        {
                            id: 16,
                            name: '南沙',
                            children: []
                        }
                    ]
                }
            ]
        }
    }
}
</script>

效果


完整代码

<template>
    <div>
        <el-tree
            :data="tree"
            highlight-current
            node-key="id"
            :props="{
                children: 'children',
                label: 'name'
            }"
            @node-expand="openTreeNode"
            @node-collapse="closeTreeNode"
            ref="tree"
            @node-contextmenu="openTreeMenu"
        >
        </el-tree>
        <div v-show="showTreeMenu" class="treeMenu">
            <div @click="addOrg">
                <i class="el-icon-plus" style="color: #1e9fff"></i>
                增加子分组
            </div>
            <div @click="editOrg">
                <i class="el-icon-edit" style="color: #fcc465"></i>
                修改分组名称
            </div>
            <div @click="deleteOrg">
                <i class="el-icon-delete" style="color: red"></i>
                删除分组及子分组
            </div>
        </div>
    </div>
</template>

<script>
export default {
    methods: {
        addOrg() {
            console.log('添加子分组', this.contextNode)
        },
        editOrg() {
            console.log('修改分组名称', this.contextNode)
        },
        deleteOrg() {
            this.$confirm(`删除 [${this.contextNode.name}] 分组、下级子分组 <br>是否继续?`, '提示', {
                dangerouslyUseHTMLString: true,
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning',
                center: true
            }).then(console.log('删除分组及下级子分组', this.contextNode))
        },
        openTreeMenu(event, data, node, target) {
            console.log(event, data, node, target)
            this.showTreeMenu = true // 显示菜单
            this.contextNode = data // 存储数据
            document
                .querySelector('.treeMenu')
                .setAttribute('style', `top:${event.clientY + 10}px;left:${event.clientX + 10}px;`)
            document.addEventListener('click', this.closeTreeMenu)
            document.addEventListener('contextmenu', this.closeTreeMenu)
        },
        closeTreeMenu() {
            this.showTreeMenu = false // 关闭菜单
            document.removeEventListener('click', this.closeTreeMenu)
            document.removeEventListener('contextmenu', this.closeTreeMenu)
        },
        openTreeNode(data) {
            console.log('节点被展开')
            this.showTreeMenu = false
            console.log(data)
        },
        closeTreeNode(data) {
            console.log('节点被关闭')
            this.showTreeMenu = false
            console.log(data)
        }
    },
    data() {
        return {
            showTreeMenu: false,
            contextNode: {},
            tree: [
                {
                    id: 1,
                    name: '北京',
                    children: [
                        {
                            id: 5,
                            name: '朝阳',
                            children: [
                                {
                                    id: 17,
                                    name: '双塔',
                                    children: []
                                },
                                {
                                    id: 18,
                                    name: '龙城',
                                    children: []
                                }
                            ]
                        },
                        {
                            id: 6,
                            name: '丰台',
                            children: [
                                {
                                    id: 19,
                                    name: '新村',
                                    children: []
                                },
                                {
                                    id: 20,
                                    name: '大红门',
                                    children: []
                                },
                                {
                                    id: 21,
                                    name: '长辛店',
                                    children: [
                                        {
                                            id: 22,
                                            name: '东山坡',
                                            children: []
                                        },
                                        {
                                            id: 23,
                                            name: '北关',
                                            children: []
                                        },
                                        {
                                            id: 24,
                                            name: '光明里',
                                            children: []
                                        },
                                        {
                                            id: 25,
                                            name: '赵辛店',
                                            children: []
                                        },
                                        {
                                            id: 26,
                                            name: '西峰寺',
                                            children: []
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            id: 7,
                            name: '海淀',
                            children: []
                        },
                        {
                            id: 8,
                            name: '房山',
                            children: []
                        },
                        {
                            id: 10,
                            name: '顺义',
                            children: []
                        }
                    ]
                },
                {
                    id: 2,
                    name: '上海',
                    children: [
                        {
                            id: 11,
                            name: '黄埔',
                            children: []
                        },
                        {
                            id: 12,
                            name: '徐汇',
                            children: []
                        }
                    ]
                },
                {
                    id: 3,
                    name: '广州',
                    children: [
                        {
                            id: 13,
                            name: '荔湾',
                            children: []
                        },
                        {
                            id: 14,
                            name: '白云',
                            children: []
                        },
                        {
                            id: 15,
                            name: '越秀',
                            children: []
                        },
                        {
                            id: 16,
                            name: '南沙',
                            children: []
                        }
                    ]
                }
            ]
        }
    }
}
</script>

<style lang="less" scoped>
.treeMenu {
    font-size: 14px;
    position: fixed;
    padding: 2px 0px 5px;
    z-index: 99999;
    top: 50%;
    left: 50%;
    background-color: rgba(255, 255, 255, 0.9);
    overflow: hidden;
    border-radius: 5px;
    border: 1px solid #e6ebf5;
    box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
    div {
        padding: 2px 10px;
        box-sizing: border-box;
        text-align: left;
    }
    div:hover {
        background-color: #eee;
        cursor: pointer;
    }
}
</style>

标签:el,console,name,tree,children,右键,节点,data,id
From: https://www.cnblogs.com/guangdelw/p/18008402

相关文章

  • 题解 ARC171C【Swap on Tree】
    每棵子树内只可能有至多一个外来的数,且外来的数是多少并不影响方案数,因此考虑设\(f_{u,i,0/1}\)表示考虑以\(u\)为根的子树,与\(u\)相连的所有边中断了\(i\)条,且\(u\)与其父亲之间的边有没有断的方案数。设\(g_{u,c}=\sumf_{u,i,c}\)。每个节点的初始状态是\(f_{u,0,......
  • 使用Sentinel实现隔离、限流
    功能对比 SentinelHystrixresilience4j隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离信号量隔离熔断降级策略基于响应时间、异常比率、异常数基于异常比率基于异常比率、响应时间实时统计实现滑动窗口(LeapArray)滑动窗口(基于RxJava)RingBitBuf......
  • EXCEL自动填充
    办公软件让我们的工作更方便快捷,如何灵活运用办公软件可是一门大学问。大家都知道在鼠标指到单元格右下角,指针变成十字的时候下拉单元格就能实现自动填充,可当该列需要填充几千个单元格的时候,下拉就变得不方便了,下面就来分享一个可以快速批量填充的方法方法/步骤先来看一下下面这个......
  • 你不应该从一个 Model 组件暴露出 {open, close} 这样的命令式句柄,最好是像 这样,将 i
    你不应该从一个Model组件暴露出{open,close}这样的命令式句柄,最好是像这样,将isOpen作为一个prop。为什么这样要求?在React和现代UI开发中,遵循声明式编程范式通常被认为是一种最佳实践。暴露命令式的句柄(如open和close方法)会导致组件之间产生更紧耦合的关系,并且破坏了数......
  • CSS3属性之 text-overflow:ellipsis
    语法:text-overflow:clip|ellipsis默认值为clip不显示省略标记clip:当前对象内文本溢出时不显示省略标记,而是将溢出部分裁剪。ellipsis:当对象内文本一处时显示省略标记(...)。 一、常见的单行文本溢出显示省略写法:text-overflow:ellipsis;overflow:hidden;white-sp......
  • axios导出Excel或word
    axios导出Excel或word1.通用方法书写importaxiosfrom'axios'import{saveAs}from'file-saver'//创建axios实例constrequest=axios.create({baseURL:'http://192.168.0.101:8081/zj_travel',//所有的请求地址前缀部分(没有后端请求不用写)timeout:80......
  • Development in a rootless enviroment
    HowtoinstallpackagesUsingbrew,Homebrew/LinuxbrewDownloadGithubRepositoryHomebrewfromLinkInstallitunder~/.homebrewWritethefilelocationtothebashrcfileexportPATH="[homepath]/.homebrew/bin:$PATH"Installlike:brewinst......
  • 在K8S中,Minikube、Kubectl、Kubelet是什么?
    在Kubernetes(简称K8s)生态系统中,Minikube、kubectl和kubelet是三个不同的组件,各自扮演着不同的角色:Minikube:Minikube是一个工具,用于在单个节点上部署一个本地的Kubernetes集群。这对于开发者在本地开发环境进行Kubernetes应用测试和调试非常有用。它能够在个人计算机上启动一个......
  • [Elasticsearch] Elasticsearch 启动访问报错问题
    Elasticsearch启动访问报错问题产生的问题与解决方案环境:Windows10ES版本:8.12.0现象:双击elasticsearch.bat文件启动后,访问http://127.0.0.1:9200地址报了一个错误:receivedplaintexthttptrafficonanhttpschannel,closingconnectionNetty4HttpChannel.........
  • [office] excel中把汉字转换成拼音的方法
    在excel中把的汉字转换成拼音,拼音在字的上面,在word和EXCEL中,都可以,再粘贴到别的地方,用起来不如word,那么下面小编就教你具体怎么怎么把汉字转换成拼音吧。希望对你有帮助!excel中把汉字转换成拼音的方法打开需要转换的excel表格excel中把汉字转换成拼音的方法图1单击......