vue 自定义右键样式的实例代码


Posted in Javascript onNovember 06, 2019

最近用python写了个小说程序的api,想着用 vue 做个系统管理数据,脑子里出现的是这个画面:

vue 自定义右键样式的实例代码 

但是这种样式的管理后台已经做了太多了,已经审美疲劳,后面又想了一种类操作系统的UI界面:

vue 自定义右键样式的实例代码

主要是靠 双击右键 来操作,可操作多个模态框,跟操作 windows 类似,接下来在里面拆出一个功能块来写一篇文章,就是 自定义系统默认的右键

自定义右键操作有五个步骤: 阻止 默认右键。 获取当前右键点击时的 x / y 坐标,及 id 。 自定义右键菜单样式及内容,定位在指定的位置后显示。 返回对应点击目录的事件如: 查看删除编辑 。 在任何地方点击左键时 隐藏右键菜单 。 关键方法:

@contextmenu.prevent

这个是vue内置的,点击右键(阻止默认右键的默认行为)的一个回调方法,他返回了一大串东西这里我用到的是这两个(用于定位显示菜单的x,y位置)

vue 自定义右键样式的实例代码

x_indexy_index 是储存在 data 中的,用于定位模态框位置。

ctrlId 用于给接口处理的依据

showMenu 用于判断是否显示右键菜单

<!--template-->
<ul>
  <li class="role_list" 
	v-for="(item,index) in role" 
	:key="index"
	@contextmenu.prevent="(e)=>{
		x_index = e.layerX;
	    y_index = e.layerY;
		ctrlId = item.id;
		showMenu = true;
	}">
	  <img :src="item.head_portrait" alt="">
	  <p>{{item.name}}</p>
	</li>
</ul>

需要的参数(x,y,id)都具备了,因为右键操作很多地方都用到了,所以封装成了一个组件

right_menu.vue 组件代码

参数名 注释 x x坐标 y y坐标 showMenu 显示状态

参数名 注释
x x坐标
y y坐标
showMenu 显示状态

组件使用

<template>
  <div class="modal_data_box">
    <ul>
      <li class="role_list" 
        v-for="(item,index) in role" 
        :key="index"
        @contextmenu.prevent="(e)=>{
          x_index = e.layerX;
          y_index = e.layerY;
          ctrlId = item.id;
          showMenu = true;
        }">
        <img :src="item.head_portrait" alt="">
        <p>{{item.name}}</p>
      </li>
    </ul>
	<!--组件-->
	<right-menu :x="x_index"
	      :y="y_index" 
	      :showMenu="showMenu"
	      @close="closeMenu"
	      @open="openDetail"
	      @del="delAttr"
	      @update="updateArr">
	</right-menu>
  </div>
</template>
<script>
  // 导入组件
	import rightMenu from '../module/right_menu.vue';
	export default{
		name:"roleModal",
		components:{rightMenu},
		data(){
			return {
				x_index:0,
				y_index:0,
				ctrlId:'',
				showMenu:false,
				role:[],
			}
		},
		methods:{
		  //关闭回调 
		  closeMenu(state){
		    console.log('关闭')
		    this.showMenu = state;
		  },
		  //打开详情回调 			
		  openDetail(){
		    console.log('编辑')
		  },
		  //删除回调 			
		  delAttr(){
		    console.log('删除')
		  },
		  //编辑回调 			
		  updateArr(){
		    console.log('编辑')
		  },
		}
	}
</script>

修复漏洞

d[o_0]b同学发现了一个漏洞,就是当鼠标在屏幕右边点击时,菜单会被遮挡住,这边做了一些调整。

修复前:

vue 自定义右键样式的实例代码

//原来的代码
<ul>
  <li class="role_list" 
	v-for="(item,index) in role" 
	:key="index"
	@contextmenu.prevent="(e)=>{
		x_index = e.layerX;
	    y_index = e.layerY;
		ctrlId = item.id;
		showMenu = true;
	}">
	  <img :src="item.head_portrait" alt="">
	  <p>{{item.name}}</p>
	</li>
</ul>

修复后:

vue 自定义右键样式的实例代码

//修改后的代码,(由于要判断,所以单独写了个方法,把e跟item都传过去)
<ul>
	<li class="role_list" 
		v-for="(item,index) in role" 
		:key="index"
		@contextmenu.prevent="(e)=>{
			rightClick(e,item)
		}">
		<img :src="item.head_portrait" alt="">
		<p>{{item.name}}</p>
	</li>
</ul>

//对应的rightClick方法
rightClick(e,item){
	// 屏幕可见宽
	let clientWidth = document.body.clientWidth;
	// 菜单宽
	let menuWidth = 150;
	// 点击右键时会返回对应的clientX,用这个值与(clientWidth+菜单宽度)对比,如果大于的话,就把菜单左偏移一个菜单宽
	let clickClientX = e.clientX + menuWidth
	if(clickClientX > clientWidth){
		console.log("菜单超出视线范围")
		this.x_index = e.layerX - menuWidth;
	}else{
		this.x_index = e.layerX;
	}
	this.y_index = e.layerY;
	this.ctrlId = item.id;
	this.showMenu = true;
},

总结

以上所述是小编给大家介绍的vue 自定义右键样式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
取选中的radio的值
Jan 11 Javascript
js onload事件不起作用示例分析
Oct 09 Javascript
浅析tr的隐藏和显示问题
Mar 05 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
Aug 15 Javascript
jquery图片切换插件
Mar 16 Javascript
浅析AngularJS Filter用法
Dec 28 Javascript
react路由配置方式详解
Aug 07 Javascript
AngularJS 购物车全选/取消全选功能的实现方法
Aug 14 Javascript
代码详解Vuejs响应式原理
Dec 20 Javascript
Vue3.x源码调试的实现方法
Oct 13 Javascript
Vuex的实战使用详解
Oct 31 Javascript
vue axios封装httpjs,接口公用配置拦截操作
Aug 11 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
Nov 06 #Javascript
vue 解决computed修改data数据的问题
Nov 06 #Javascript
微信小程序页面渲染实现方法
Nov 06 #Javascript
微信小程序页面间传递数组对象方法解析
Nov 06 #Javascript
vue 获取及修改store.js里的公共变量实例
Nov 06 #Javascript
对vuex中getters计算过滤操作详解
Nov 06 #Javascript
node解析修改nginx配置文件操作实例分析
Nov 06 #Javascript
You might like
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
深入剖析javascript中的exec与match方法
2016/05/18 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
泛谈JS逻辑判断选择器 || &amp;&amp;
2019/05/24 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
python3解析库pyquery的深入讲解
2018/06/26 Python
对Python w和w+权限的区别详解
2019/01/23 Python
python 多线程串行和并行的实例
2019/02/22 Python
python字符串循环左移
2019/03/08 Python
Python操作qml对象过程详解
2019/09/26 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
为什么说python更适合树莓派编程
2020/07/20 Python
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
经典优秀个人求职信分享
2013/12/12 职场文书
文秘个人求职信范文
2014/04/22 职场文书
中学生操行评语
2014/04/24 职场文书
《猴子种果树》教学反思
2014/04/26 职场文书
伏羲庙导游词
2015/02/09 职场文书
二审答辩状格式
2015/05/22 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
导游词之潮音寺
2019/09/26 职场文书
Python实现byte转integer
2021/06/03 Python
python之PySide2安装使用及QT Designer UI设计案例教程
2021/07/26 Python