首页 > 其他分享 >vue 3+TS 封装自定义右键全局菜单(虚拟节点)

vue 3+TS 封装自定义右键全局菜单(虚拟节点)

时间:2024-03-12 15:02:38浏览次数:21  
标签:菜单 const name 自定义 vue 右键 data

有时我们需要点击(右键或左键)某个元素时弹出菜单,实现复制、粘贴、删除等功能。本文将介绍如何封装一个自定义的右键全局菜单(无三方依赖)。封装的菜单可自定义菜单项,图标,禁用,分割线,隐藏等。并且可以在全局任意地方使用。源码在文章末尾。

效果

使用

<template>
  <div>
    <div @click.right.native="showContextMenu($event, data)">
      右键点击我
    </div>
  </div>
</template>
<script lang="ts" setup>
import { ContextMenuOptions, MenuItem } from '@/components/ContextMenu/types'

interface Data {
  name: string
  count: number
}

// data 无实际意义,只是为了展示菜单可以根据点击不同的数据显示不同的菜单项
const data: Data = {
  name: '张三',
  count: 1
}

const showContextMenu = (e: MouseEvent, data: Data) => {
  const items: MenuItem[] = [
    {
      label: `复制 ${data.name}`,
      icon: 'copy',
      onClick: () => {
        console.log(`已复制 ${data.name}`)
      }
    },
    {
      label: `test ${data.name}`,
      visible: data.count > 0,
      onClick: () => {
        console.log(`test ${data.name}`)
      }
    }
  ]
  const options: ContextMenuOptions = {
    items
  }
  proxy.$contextMenu(e, options)
}
</script>

实现

渲染用的是 vue 的 h (创建虚拟节点) 和 render (渲染虚拟节点) 函数。

这个全局菜单目前只是实现了基本功能,期待大家的 Issue 和 PR。

源码地址

大家可以根据自己的网络情况选择国内或国外的地址。

GitHub
Gitee

标签:菜单,const,name,自定义,vue,右键,data
From: https://www.cnblogs.com/tangllty/p/18068317

相关文章

  • VUE3将时间戳转换为时间格式
     formatDate(time){constdate=newDate(time*1000);constyear=date.getFullYear();constmonth=String(date.getMonth()+1).padStart(2,'0');//月份从0开始,所以加1,并用0填充constday=String(date.getDate()).padStart(2,&#......
  • scapy编写自定义协议
    编写自定义格式的步骤如下首先先定义一个类,把所有的字段标注下来,每个字段占用几个字节或者几个bit例子:我们这里需要构造一个trill协议的数据包,但是scapy没有对这个的支持,查看官方的协议手册https://www.rfc-editor.org/rfc/rfc6325.html#section-3.8classTRILL(Packet):......
  • Vue — 路由
    一、路由的使用步骤1.Vue2.0版本下载对应路由3.6.5版本[email protected]/[email protected].引入路由包importVueRouterfrom'vue-router';3.安装注册Vue.use(VueRouter)4.创建路由对象constrouter=newVueRouter()5.注入到newVue()中,与V......
  • 在Vue 3中,当computed属性中使用到的store中的变量或ref变量发生更新时,computed属性会
    computed传入一个getter函数,返回一个默认不可手动修改的ref对象在Vue3中,当computed属性中使用到的store中的变量或ref变量发生更新时,computed属性会自动重新计算,反映出最新的值。就是任何组件内导致store的变量变化也会导致其它组件内的computed变量变化与执行在Vue3中,当......
  • Vue3中使用TinyMce编辑器
    在线演示地址:TinyMce编辑器邮件发送一,安装TinyMce富文本npminstall@tinymce/tinymce-vue-Snpminstalltinymce-STinyMce本身是英文编辑器,所以还需要下载中文本地化文件:https://www.tiny.cloud/get-tiny/language-packages/下载完成后放入node_modules下的tinymce文......
  • VUE后台获取数据,并将数据递归为树接口所需数据形式
    后台获取数据形式(parentID=0的是父级,parentID不为0的,如果parentID与某个对象中的id相等,则表示为该对象的子级。) 代码转换:<script>varroomMenuDataL;//后台获取的教室数据methods:{//获取教室树getroommenu(){consttoken=this.$cookieTools.getTo......
  • vue3 keepalive 失效
    好久没更新博客了,重复拧螺丝keepalive之前用过,但是好久了,所以这次遇到问题觉得有点新颖我遇到的问题是在路由里面设置子路由,子路由的router-view设置keepalive不生效的问题 之前用了keep-alive没有用v-slot因为router-view就是一个单独的组件,他的本质并不是使用url对应的组......
  • Vue学习笔记46--scoped样式 + less
    scoped样式<!--组件的默认样式css写法--><!--<stylescoped>.demo{background-color:cadetblue;}</style>--><stylelang="less"scoped>.demo{background-color:cadetblue;.myfontsize{font-size:40px;}......
  • carousel 轮播自定义进度条
    <!--VueSFC--><template><divclass="propor-box"><divclass="p20"><div><el-carousel:interval="5000"arrow="always"height="250px">&......
  • cnetos7 ISO 镜像自定义制作
    简介:  此自定义镜像针对centos7系统版本,通过tar打包原系统服务将其放入ISO镜像中在安装时执行解压导入新安装系统中实现系统服务的自定义安装。针对cnetos7目前只测试出这一种方案,暂时没找到其他好的方案实现系统的模板ISO制作,目前版本存在缺陷镜像中的tar包非加密......