vue中如何实现右键菜单?

以下代码示例可以参考使用:

<template>
	<div @contextmenu.prevent>
		<div class="bigWrapper">
			<div class="wrapper" v-for="(item, index) in list" :key="index" @click="clickMenu" @contextmenu.prevent="openRightMenu($event, item)">
				<div class="contentBox">
					{{ item.date }}---{{ item.wheather }}
				</div>
			</div>
		</div>

		<!-- 右键菜单 -->
		<!-- 写法一: -->
		<ul class="u-contextmenu" v-show="rightClickObj.visible" :style="{ left: rightClickObj.left + 'px', top: rightClickObj.top + 'px' }">
			<li @click="operateMenu(currentListItem, 'edit')">
				<i class="icon_menu_reset"></i>
				<span>编辑</span>
			</li>
			<li @click="operateMenu(currentListItem, 'delete')">
				<i class="icon_menu_delete"></i>
				<span>删除</span>
			</li>
		</ul>
		<br>
		
		<!-- 写法二: -->
		<!-- <ul class="u-contextmenu" v-show="rightClickObj.visible" :style="{ left: rightClickObj.left + 'px', top: rightClickObj.top + 'px' }">
			<li v-for="(item, index) in menuList" :key="index" @click="operateMenu2(item, index)">
				<i :class="item.iconClass"></i>
				<span>{{ item.text }}</span>
			</li>
		</ul> -->
	</div>
</template>

<script>
export default {
	name: 'rightMenu',
	data() {
		return {
			content: '我是方框中内容',
			list: [
				{ date: '星期一', wheather: '晴天' },
				{ date: '星期二', wheather: '暴雨' },
				{ date: '星期三', wheather: '多云' },
				{ date: '星期四', wheather: '下雪' },
				{ date: '星期五', wheather: '雷阵雨' },
				{ date: '星期六', wheather: '龙卷风' },
				{ date: '星期日', wheather: '沙尘暴' },
			],
			menuList: [
				{ text: '编辑', iconClass: 'icon_menu_reset' },
				{ text: '删除', iconClass: 'icon_menu_delete' }
			],
			rightClickObj: {
				visible: false,
				top: 0,
				left: 0
			},
			currentListItem: {}
		}
	},
	watch: {
		// 右键菜单显隐
    "rightClickObj.visible"(value) {
      if (value) {
        document.body.addEventListener('click', this.closeRightMenu)
      } else {
        document.body.removeEventListener('click', this.closeRightMenu)
      }
    },
	},
	methods: {
		clickMenu(e) {
			console.log('左键点击', e);
		},
		// 右键点击
		openRightMenu(e, item) {
			this.currentListItem = item
			console.log('右键点击', item.date);
			const bodyWidth = document.documentElement.clientWidth
			const maxLeft = bodyWidth - 200
			var x = e.pageX <= maxLeft ? e.pageX : maxLeft
			var y = e.pageY
			this.rightClickObj.left = x
			this.rightClickObj.top = y
			this.rightClickObj.visible = true
		},
		// 右键菜单隐藏
		closeRightMenu() {
			this.rightClickObj.visible = false
		},
		// 右键菜单项操作
		operateMenu(item, type) {
			switch(type) {
				case 'edit': 
					console.log('编辑', item.date, item.wheather);
					item.wheather = '变成晴天啦'
					break;
				case 'delete': 
					console.log('删除', item.date, item.wheather);
					this.list.splice(0,1)
				break;
			}
		},
		operateMenu2(item, index) {
			switch(index) {
				case 0:
					console.log('编辑编辑000', this.currentListItem);
					break;
				case 1:
					console.log('删除删除111', this.currentListItem);
			}
		}
	}
}
</script>

<style lang="less" scoped>
.bigWrapper {
	display: flex;
}
.wrapper {
	width: 160px;
	height: 100px;
	border: 1px solid aqua;
	cursor: pointer;
	margin-right: 20px;
}
</style>
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值