Vue3 Element-Plus el-tree 右键菜单组件

参考代码:实现Vue3+Element-Plus(tree、table)右键菜单组件

这篇文章的代码确实能用,但是存在错误,修正后的代码:

html 复制代码
<template>
    <div style="text-align: right">
        <el-icon size="12" color="#999" style="cursor: pointer"><Plus /></el-icon>
    </div>
    <el-tree
        :data="catalogTreeData"
        :props="{ label: 'label', children: 'children' }"
        :expand-on-click-node="false"
        ref="deptTreeRef"
        node-key="id"
        highlight-current
        default-expand-all
        @node-contextmenu="rightClick"
    />
    <div class="rightMenu" v-show="showMenu">
        <ul>
            <li v-for="(menu, index) in menus" @click="menu.click" :key="index">
                <el-icon>
                    <component :is="menu.icon" />
                </el-icon>
                <span style="margin-left: 10px">
                    {{ menu.name }}
                </span>
            </li>
        </ul>
    </div>
</template>
<script lang="ts" setup>
import { FolderAdd, Message, Plus, UserFilled } from '@element-plus/icons-vue'
import { markRaw } from 'vue'
const showMenu = ref(false)

const menus = ref<
    {
        icon: any
        name: string
        click: () => void
    }[]
>([])

const catalogTreeData = [
    {
        label: 'Level one 1',
        children: [
            {
                label: 'Level two 1-1',
                children: [
                    {
                        label: 'Level three 1-1-1'
                    }
                ]
            }
        ]
    },
    {
        label: 'Level one 2',
        children: [
            {
                label: 'Level two 2-1',
                children: [
                    {
                        label: 'Level three 2-1-1'
                    }
                ]
            },
            {
                label: 'Level two 2-2',
                children: [
                    {
                        label: 'Level three 2-2-1'
                    }
                ]
            }
        ]
    },
    {
        label: 'Level one 3',
        children: [
            {
                label: 'Level two 3-1',
                children: [
                    {
                        label: 'Level three 3-1-1'
                    }
                ]
            },
            {
                label: 'Level two 3-2',
                children: [
                    {
                        label: 'Level three 3-2-1'
                    }
                ]
            }
        ]
    }
]

// 右击方法
const rightClick = (event: MouseEvent, data: any, node: any, json: any) => {
    event.preventDefault()
    showMenu.value = false

    // 显示位置
    let menuPosition = document.querySelector('.rightMenu') as HTMLElement
    if (menuPosition) {
        menuPosition.style.left = event.clientX + 'px'
        menuPosition.style.top = event.clientY + 'px'
    }

    menus.value = [
        {
            icon: markRaw(FolderAdd), // 默认图标
            name: '新增子目录', // 默认名称
            click: () => {
                console.log('新增子目录')
            }
        },
        {
            icon: markRaw(Message),
            name: '编辑',
            click: () => {
                console.log('编辑')
            }
        },
        {
            icon: markRaw(UserFilled),
            name: '删除',
            click: () => {
                console.log('删除')
            }
        }
    ]

    showMenu.value = true
    document.addEventListener('click', close)
}

function close() {
    showMenu.value = false
}
</script>
<style scoped>
.rightMenu {
    position: fixed;
    z-index: 99999999;
    cursor: pointer;
    border: 1px solid #eee;
    box-shadow: 0 0.5em 1em 2px rgba(0, 0, 0, 0.1);
    border-radius: 6px;
    color: #606266;
    font-size: 14px;
    background: #fff;
}

.rightMenu ul {
    list-style: none;
    margin: 0;
    padding: 0;
    border-radius: 6px;
}

.rightMenu ul li {
    padding: 6px 10px;
    border-bottom: 1px solid #c8c9cc;
    box-sizing: border-box;
    display: flex;
    align-items: center;
    justify-content: flex-start;
}

.rightMenu ul li:last-child {
    border: none;
}

.rightMenu ul li:hover {
    transition: all 0.5s;
    background: #ebeef5;
}
.rightMenu ul li:hover {
    transition: all 0.5s;
    background: #ebeef5;
}

.rightMenu ul li:first-child {
    border-radius: 6px 6px 0 0;
}
.rightMenu ul li:last-child {
    border-radius: 0 0 6px 6px;
}
</style>
相关推荐
David凉宸16 小时前
Vue 3生态系统深度解析与最佳实践
前端·javascript·vue.js
BYSJMG16 小时前
大数据分析案例:基于大数据的肺癌数据分析与可视化系统
java·大数据·vue.js·python·mysql·数据分析·课程设计
a1117761 天前
医院挂号预约系统(开源 Fastapi+vue2)
前端·vue.js·python·html5·fastapi
计算机毕设VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
行走的陀螺仪1 天前
uni-app + Vue3编辑页/新增页面给列表页传参
前端·vue.js·uni-app
-凌凌漆-1 天前
【vue】选项式api与组合式api
前端·javascript·vue.js
BYSJMG1 天前
计算机毕业设计选题推荐:基于大数据的肥胖风险分析与可视化系统详解
大数据·vue.js·数据挖掘·数据分析·课程设计
phltxy1 天前
Vue3入门指南:从环境搭建到数据响应式,开启高效前端开发之旅
前端·javascript·vue.js
东东5161 天前
校园求职招聘系统设计和实现 springboot +vue
java·vue.js·spring boot·求职招聘·毕设
白中白121381 天前
Vue系列-2
前端·javascript·vue.js