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 相关文章推荐
JavaScript的变量作用域深入理解
Oct 25 Javascript
JavaScript CSS修改学习第二章 样式
Feb 19 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
Dec 12 Javascript
jquery select动态加载选择(兼容各种浏览器)
Feb 01 Javascript
JS复制到剪贴板示例代码
Oct 30 Javascript
js报$ is not a function 的问题的解决方法
Jan 20 Javascript
基于jQuery实现复选框是否选中进行答题提示
Dec 10 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
May 12 Javascript
同步文本框内容JS代码实现
Aug 04 Javascript
vue父子组件的嵌套的示例代码
Sep 08 Javascript
Vue源码学习之初始化模块init.js解析
Nov 02 Javascript
bootstrap table实现iview固定列的效果实例代码详解
Sep 30 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
php中通过数组进行高效随机抽取指定条记录的算法
2013/09/09 PHP
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
2015/02/07 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
YII框架中搜索分页jQuery写法详解
2016/12/19 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
2018/05/16 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
js form action动态修改方法
2008/11/04 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
JS中使用media实现响应式布局
2017/08/04 Javascript
zTree异步加载展开第一级节点的实现方法
2017/09/05 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
2017/11/15 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
JavaScript常用数学函数用法示例
2018/05/14 Javascript
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
[45:16]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第一场 12.12
2020/12/16 DOTA
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
PyCharm设置护眼背景色的方法
2018/10/29 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
关于Keras Dense层整理
2020/05/21 Python
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
中国高端家电购物商城:顺电
2018/03/04 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
应用电子技术专业个人求职信
2013/09/21 职场文书
校园之声广播稿
2014/01/31 职场文书
贷款承诺书范文
2014/05/19 职场文书
2014年教研工作总结
2014/12/06 职场文书
SqlServer: 如何更改表的文件组?(进而改变存储位置)
2021/04/05 SQL Server