VUE_网页自定义右键菜单组件

news2024/11/17 17:53:00

在这里插入图片描述

可以在uni-appvue脚手架项目使用

引入组件会接管页面右键事件,所有options为空数组时,在页面右键将没有反应

rightMenu.vue

<template>
	<view>
		<view v-if="show" class="contextMenu" :style="lay_style" @contextmenu.stop="() => {return false}">
			<view class="menu-lay" v-for="(item, index) in options" :key="index">
				<view class="menu-solid" v-if="item.type == 'solid'"></view>
				<view class="menu-list" v-else @click="onMenu(item, index)">
					<image class="menu-icon" :src='item.icon' v-if="item.icon"></image>
					<view class="menu-name" :style="{color: item.color || props.color}">{{item.name}}</view>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	/**
	 * rightMenu 右键菜单
	 * @description 弹出层组件,为了解决遮罩弹层的问题
	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
	 * @property {Object} props 配置对象
	 * 	@property {Number} props.width 弹框宽度 单位px(默认160)
	 * 	@property {String} props.color 全局菜单字体颜色 (默认#333333)
	 * @property {Array} options 菜单列表
	 * 	@property {String} options.name 菜单名字
	 * 	@property {String} options.icon 菜单图标
	 * 	@property {String} options.type 菜单或分界线(菜单可不填,分界线:solid)
	 * 	@property {String} options.color 菜单文字颜色
	 * 	@property {Boolean} options.disabled 是否禁用
	 * @event {Function} change 点击菜单触发(当前项,索引)
	 */
	export default {
		props: {
			options: {
				type: Array,
				default() {
					return []
				}
			},
			props: {
				type: Object,
				default: () => {
					return {
						width: 160,
						color: '#333333'
					}
				}
			}
		},
		data() {
			return {
				show: false,
				lay_style: {}
			}
		},
		created() {
			document.addEventListener('contextmenu', this.showContextMenu);
		},
		beforeDestroy() {
			document.removeEventListener('contextmenu', this.showContextMenu);
		},
		methods: {
			showContextMenu(event) {
				event.preventDefault();
				this.show = false
				const x = event.pageX;
				const y = event.pageY;
				const w = this.props.width
				/**
				//	uni-app项目可使用官方api
				const systemInfo = uni.getSystemInfoSync();
				const width = systemInfo.windowWidth;
				const height = systemInfo.windowHeight;
				*/
				const width = window.innerWidth
				const height = window.innerHeight

				const obj = {
					width: w,
					left: x + 'px',
					top: y + 'px'
				}
				if (+w + +x > width) obj.left = +x - +w + 'px'
				let dh = this.options.filter(item => !item.type || item.type != 'solid').length * 32 +
					this.options.filter(item => item.type == 'solid').length * 7 + 7
				if (dh + +y > height) obj.top = +y - +dh + 'px'
				this.$set(this, 'lay_style', obj)
				this.$nextTick(() => {
					this.show = true
				})
			},
			onMenu(item, index) {
				if (item.type == 'solid' || item.disabled) return false
				this.show = false
				this.$emit('change', item, index)
			}
		}
	}
</script>
<style lang='scss' scoped>
	view {
		box-sizing: border-box;
	}

	@keyframes fadeIn {
		from {
			opacity: 0;
		}

		to {
			opacity: 1;
		}
	}

	.contextMenu {
		width: 160px;
		position: fixed;
		background: #FFFFFF;
		padding: 3.5px;
		border-radius: 11px;
		border: 2px solid #F5F5F5;
		box-shadow: 0 4px 8px #F5F5F5;
		z-index: 998;

		animation-name: fadeIn;
		animation-duration: .5s;
		animation-fill-mode: forwards;

		.menu-lay {
			width: 100%;

			.menu-list {
				width: 100%;
				height: 32px;
				border-radius: 7px;
				padding: 0 8px;
				display: flex;
				align-items: center;
				cursor: pointer;

				&:hover {
					background: #F5F5F5;
				}

				.menu-icon {
					width: 18px;
					height: 18px;
					margin-right: 7px;
					display: block;
				}

				.menu-name {
					font-size: 14px;
					color: #333333;
				}
			}

			.menu-solid {
				margin: 3.5px;
				height: 1px;
				background: #F5F5F5;
			}
		}
	}
</style>

示例

<template>
	<view>
		<rightMenu :options="options" @change="change"></rightMenu>
	</view>
</template>

<script>
	import rightMenu from '@/components/rightMenu/index.vue'
	const icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAUJJREFUWEftljFywjAURFcFla9AZqBJk0vkJoQULuN/g8ANvildJNyEXIKGJswkV3CVwpnPfDM2YCRZMG6kGVdaaZ/XtrwGAw8zsD8iwE0TIKJnyyPdM/O+qbkJABFNAHwCsAGI9xeAeQ0SDHDBXAy6hoDKtWDmpYjOAIjoxfPLmOmdS7xT21oiqkTDzAfvI4DeyUYJbfuczjuZy6JrAO8SjT6j1otio2HmuU1Tz18DaEXjuqGvLgLEBGICMYGYgFcCRLQC8Aog0SN363j0PqmuBPDBzG+9/gVZlv0YY8aOphdlVVX95nn+0AsgTdNRkiSPIQBlWe6KovhzAfjWLjA97W0hAM212jnE59gfmoWk7gPSBbz6gAdgdyVrdLta5LGvl3QNYNlZShVEIO4x7lPLQ0iDa3mIeasVh27Ud/3gCfwDgzfQIRDvSjkAAAAASUVORK5CYII='
	export default {
		components: {
			rightMenu
		},
		data() {
			return {
				options: [{
						name: '新建文件夹',
						icon: icon
					},
					{
						type: 'solid'
					},
					{
						name: '上传文件',
						icon: icon
					},
					{
						name: '上传文件夹',
						icon: icon,
						color: 'red',
						disabled: true
					}
				]
			}
		},
		methods: {
			change(item, index) {

			}
		}
	}
</script>				

效果图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/707220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka:Kafka资料整理

一、官网 二、博主文章 1、kafka是什么 • Worktile社区 三、源码解读

一文了解云计算

目录 &#x1f34e;云服务 &#x1f34e;云计算类型 &#x1f352;公有云 &#x1f352;私有云 &#x1f352;混合云 &#x1f34e;云计算服务模式 &#x1f352;IaaS基础设施即服务 &#x1f352;PaaS平台即服务 &#x1f352;SaaS软件即服务 &#x1f352;三者之间区别 &…

4.springboot原理篇

原理篇 spring与springboot区别 spring是承载容器 springboot做的主要工作&#xff1a; ①简化配置&#xff08;省去了spring中配置xml&#xff0c;引入application.yml文件&#xff09; ②为我们提供了 spring-boot-starter-web 依赖&#xff0c;这个依赖包含了Tomcat和sprin…

二进制搭建Kubernetes集群(二)——部署Worker Node 组件

四.部署node节点 4.1 所有node节点部署 docker引擎 #所有 node 节点部署docker引擎#安装依赖包yum install -y yum-utils device-mapper-persistent-data lvm2#设置阿里云镜像源yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker- ce.…

Nuget更新全局包、缓存和临时文件夹路径位置

Nuget更新缓存 1、查看默认的Nuget路径2、更改全局包路径2.1 通过环境变量来进行修改2.2通过Nuget.Config配置文件来进行修改 3、更改http-cache路径4、更改temp文件路径5、更改plugins-cache文件路径 NuGet是一个流行的软件包管理器&#xff0c;可以帮助.NET开发人员轻松地添加…

【Python】 【Pandas 】【read_csv()】Pandas库的read_csv()方法的使用,处理:None,NULL

近期&#xff0c;使用read_csv的时候&#xff0c;遇到一个问题&#xff0c;就是本地读取的csv文件中的数据有None和NaN 两种&#xff0c;如&#xff1a; 直接使用 pd.read_csv(rF:\我爱Python\预测\历史样本.csv,encodingutf-8)发现读取的数据是将None 和 NULL 直接处理成 NaN…

SpingData-JDBC(看这篇文章就够了,新手入门指引)

JdbcTemplate 的基本使用 写在前面&#xff1a; 当DDL操作时&#xff0c;一般是用execute方法&#xff0c;这也是一种规范吧&#xff0c;这个也可以运行DML但是通常来说我DML操作是需要返回值的&#xff0c;一般就是返回影响的行数。然后这篇文章主要介绍增删改查&#xff0c…

软考A计划-系统集成项目管理工程师-项目范围管理(四)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Linux服务器网卡流量过高排查

第一种方式&#xff1a;nethogs 1.安装 yum -y install nethogs #nethogs em1 -d 3 监控eth0 并每3s刷新一次 手动安装 wget https://github.com/raboof/nethogs/archive/v0.8.5.tar.gz 依赖包&#xff1a; yum install -y libpcap libpcap-devel 编译&#xff1a; mak…

④数据封装对象(Vo、Bo、Po..)+MySQL视图

1.数据封装对象 VO&#xff08;View Object&#xff09;&#xff1a;视图对象&#xff0c;用于展示层&#xff0c;它的作用是把某个指定页面&#xff08;或组件&#xff09;的所有数据封装起来。 DTO&#xff08;Data Transfer Object&#xff09;&#xff1a;数据传输对象&a…

小黑特种兵重庆行走一天,体验了当地风土人情的leetcode之旅:剑指 Offer II 014. 字符串中的变位词

小黑代码 class Solution:def checkInclusion(self, s1: str, s2: str) -> bool:# 字符串长度n_s1 len(s1)n_s2 len(s2)if n_s1 > n_s2:return False# s1的字符计数字典count_s1 [0] * 26# 窗口计数字典count_window [0] * 26# 寻找初始窗口for i in range(n_s1):co…

SpringBoot(四)SpringBoot搭建简单服务端

通过之前的几篇文章相信大家已经对SpringBoot项目开发有了一个基本的了解。本篇&#xff0c;介绍下如何使用SpringBoot搭建一个简单的服务端&#xff0c;实现一个新用户注册的场景&#xff0c;供前端和移动端去使用。本篇需要你对SpringBoot的starter&#xff0c;mysql&#xf…

Redis概述及安装、使用和管理

文章目录 一、NoSQL非关系型数据库1.NoSQL概述2.关系型数据库和非关系型数据库区别&#xff08;1&#xff09;数据存储方式不同&#xff08;2&#xff09;扩展方式不同&#xff08;3&#xff09;对事务性的支持不同 3.非关系型数据库使用场景 二、Redis概述1.简介2.优点3.Redis…

Learn Mongodb了解DB数据库 ④

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; PHP MYSQL &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

SIMATIC WINCC中实现弹窗跟随鼠标功能(C语言脚本)的具体方法示例

SIMATIC WINCC中实现弹窗跟随鼠标功能(C语言脚本)的具体方法示例 具体C语言脚本可参考以下代码: #include "apdefap.h" //添加的头文件//定义的函数 void OnLButtonDown(char* lpszPictureName, char* lpszObjectName, char

七.错误处理

目录 1、错误处理 1、error一般是处理一些比较低级的错误&#xff0c;不会造成程序中断或者宕机。 2、panic一般是发生了致命的错误时才会被调用&#xff0c;例如数组越界&#xff0c;空指针等等&#xff0c; 2.1 手动调用panic 2.2 数组越界造成panic 2、recover函数 1、…

PaddleSeg中交互式分割EISeg的使用

EISeg(Efficient Interactive Segmentation)是基于飞桨开发的一个高效智能的交互式分割标注软件。它涵盖了通用、人像、遥感、医疗、视频等不同方向的高质量交互式分割模型。另外&#xff0c;将EISeg获取到的标注应用到PaddleSeg提供的其他分割模型进行训练&#xff0c;便可得到…

stm32-iic 时序驱动

数据发送 #include "IIC.h" #include "delay.h"void IIC_Init(void){GPIO_InitTypeDef GPIO_InitStruct;//使能GPIPFRCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//初始GPIGB8 GPIGB9 GPIO_InitStruct.GPIO_Pin GPIO_Pin_8 | GPIO_Pin_9; …

4.28 白噪声功率谱密度的估计

前一节有下面结论&#xff1a; 什么仿真的白噪声波形是均匀的&#xff0c;均匀的特点是相关函数在0时刻是相关的&#xff08;自己和自己相关的&#xff09;0以外时刻都互相不相关

PLC 网关设备如何进行数据采集?

引言&#xff1a; 在现代工业领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;被广泛应用于自动化控制系统。为了实现高效的数据收集和分析&#xff0c;工业边缘网关扮演着重要角色。本文将探讨PLC网关设备如何进行数据采集&#xff0c;并介绍一款优秀的工业边缘网…