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

打印 上一主题 下一主题

主题 795|帖子 795|积分 2385

参考代码:实现Vue3+Element-Plus(tree、table)右键菜单组件
这篇文章的代码确实能用,但是存在错误,修正后的代码:
  1. <template>
  2.     <div style="text-align: right">
  3.         <el-icon size="12" color="#999" style="cursor: pointer"><Plus /></el-icon>
  4.     </div>
  5.     <el-tree
  6.         :data="catalogTreeData"
  7.         :props="{ label: 'label', children: 'children' }"
  8.         :expand-on-click-node="false"
  9.         ref="deptTreeRef"
  10.         node-key="id"
  11.         highlight-current
  12.         default-expand-all
  13.         @node-contextmenu="rightClick"
  14.     />
  15.     <div class="rightMenu" v-show="showMenu">
  16.         <ul>
  17.             <li v-for="(menu, index) in menus" @click="menu.click" :key="index">
  18.                 <el-icon>
  19.                     <component :is="menu.icon" />
  20.                 </el-icon>
  21.                 <span style="margin-left: 10px">
  22.                     {{ menu.name }}
  23.                 </span>
  24.             </li>
  25.         </ul>
  26.     </div>
  27. </template>
  28. <script lang="ts" setup>
  29. import { FolderAdd, Message, Plus, UserFilled } from '@element-plus/icons-vue'
  30. import { markRaw } from 'vue'
  31. const showMenu = ref(false)
  32. const menus = ref<
  33.     {
  34.         icon: any
  35.         name: string
  36.         click: () => void
  37.     }[]
  38. >([])
  39. const catalogTreeData = [
  40.     {
  41.         label: 'Level one 1',
  42.         children: [
  43.             {
  44.                 label: 'Level two 1-1',
  45.                 children: [
  46.                     {
  47.                         label: 'Level three 1-1-1'
  48.                     }
  49.                 ]
  50.             }
  51.         ]
  52.     },
  53.     {
  54.         label: 'Level one 2',
  55.         children: [
  56.             {
  57.                 label: 'Level two 2-1',
  58.                 children: [
  59.                     {
  60.                         label: 'Level three 2-1-1'
  61.                     }
  62.                 ]
  63.             },
  64.             {
  65.                 label: 'Level two 2-2',
  66.                 children: [
  67.                     {
  68.                         label: 'Level three 2-2-1'
  69.                     }
  70.                 ]
  71.             }
  72.         ]
  73.     },
  74.     {
  75.         label: 'Level one 3',
  76.         children: [
  77.             {
  78.                 label: 'Level two 3-1',
  79.                 children: [
  80.                     {
  81.                         label: 'Level three 3-1-1'
  82.                     }
  83.                 ]
  84.             },
  85.             {
  86.                 label: 'Level two 3-2',
  87.                 children: [
  88.                     {
  89.                         label: 'Level three 3-2-1'
  90.                     }
  91.                 ]
  92.             }
  93.         ]
  94.     }
  95. ]
  96. // 右击方法
  97. const rightClick = (event: MouseEvent, data: any, node: any, json: any) => {
  98.     event.preventDefault()
  99.     showMenu.value = false
  100.     // 显示位置
  101.     let menuPosition = document.querySelector('.rightMenu') as HTMLElement
  102.     if (menuPosition) {
  103.         menuPosition.style.left = event.clientX + 'px'
  104.         menuPosition.style.top = event.clientY + 'px'
  105.     }
  106.     menus.value = [
  107.         {
  108.             icon: markRaw(FolderAdd), // 默认图标
  109.             name: '新增子目录', // 默认名称
  110.             click: () => {
  111.                 console.log('新增子目录')
  112.             }
  113.         },
  114.         {
  115.             icon: markRaw(Message),
  116.             name: '编辑',
  117.             click: () => {
  118.                 console.log('编辑')
  119.             }
  120.         },
  121.         {
  122.             icon: markRaw(UserFilled),
  123.             name: '删除',
  124.             click: () => {
  125.                 console.log('删除')
  126.             }
  127.         }
  128.     ]
  129.     showMenu.value = true
  130.     document.addEventListener('click', close)
  131. }
  132. function close() {
  133.     showMenu.value = false
  134. }
  135. </script>
  136. <style scoped>
  137. .rightMenu {
  138.     position: fixed;
  139.     z-index: 99999999;
  140.     cursor: pointer;
  141.     border: 1px solid #eee;
  142.     box-shadow: 0 0.5em 1em 2px rgba(0, 0, 0, 0.1);
  143.     border-radius: 6px;
  144.     color: #606266;
  145.     font-size: 14px;
  146.     background: #fff;
  147. }
  148. .rightMenu ul {
  149.     list-style: none;
  150.     margin: 0;
  151.     padding: 0;
  152.     border-radius: 6px;
  153. }
  154. .rightMenu ul li {
  155.     padding: 6px 10px;
  156.     border-bottom: 1px solid #c8c9cc;
  157.     box-sizing: border-box;
  158.     display: flex;
  159.     align-items: center;
  160.     justify-content: flex-start;
  161. }
  162. .rightMenu ul li:last-child {
  163.     border: none;
  164. }
  165. .rightMenu ul li:hover {
  166.     transition: all 0.5s;
  167.     background: #ebeef5;
  168. }
  169. .rightMenu ul li:hover {
  170.     transition: all 0.5s;
  171.     background: #ebeef5;
  172. }
  173. .rightMenu ul li:first-child {
  174.     border-radius: 6px 6px 0 0;
  175. }
  176. .rightMenu ul li:last-child {
  177.     border-radius: 0 0 6px 6px;
  178. }
  179. </style>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表