vue添加自定义右键菜单的完整实例


Posted in Vue.js onDecember 08, 2020

一、写原生方法

vue添加自定义右键菜单的完整实例

1.在所编辑的页面,需要添加右键菜单的元素,绑定contextmenu事件,如下:

<li
    v-for="item in resourceList"
    :key="item.id"
    @click="handleClickFolder(item)"
    @contextmenu.prevent="openMenu($event,item)"
   >
   ...
   </li>

2.在页面编写右键菜单内容:

<ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu">
  <!-- <li v-if="rightClickItem.fileType==99" @click="handleClickFolder(rightClickItem)">打开</li>
  <li @click="handleDelete(rightClickItem)">删除</li>
  <li @click="handleDownloadFile(rightClickItem)" v-if="rightClickItem.fileType!=99">下载</li>
  <li @click="handlePreviewFile(rightClickItem)" v-if="rightClickItem.fileType!=99">预览</li>
  <li @click="handleUpdate(rightClickItem)">编辑</li> -->
  <li>内容</li>
 </ul>

3.在data()中定义需要的变量属性

data() { 
	return {
			visible: false,
			top: 0,
			left: 0
	}
}

4.观察visible的变化,来触发关闭右键菜单,调用关闭菜单的方法

watch: {
 visible(value) {
  if (value) {
  document.body.addEventListener('click', this.closeMenu)
  } else {
  document.body.removeEventListener('click', this.closeMenu)
  }
 }
 }

5.在method中定义打开右键菜单和关闭右键菜单的两个方法

openMenu(e, item) {
  this.rightClickItem = item;

  var x = e.pageX;
  var y = e.pageY;

  this.top = y;
  this.left = x;
  
  this.visible = true;
 },
 closeMenu() {
  this.visible = false;
 }

6.在style中写右键菜单的样式

.contextmenu {
 margin: 0;
 background: #fff;
 z-index: 3000;
 position: absolute;
 list-style-type: none;
 padding: 5px 0;
 border-radius: 4px;
 font-size: 12px;
 font-weight: 400;
 color: #333;
 box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
}

.contextmenu li {
 margin: 0;
 padding: 7px 16px;
 cursor: pointer;
}

.contextmenu li:hover {
 background: #eee;
}

二、使用插件vue-context-menu

demo地址

github地址

安装:

npm install vue-contextmenu --save

引用:

import VueContextMenu from 'vue-contextmenu'
Vue.use(VueContextMenu)

使用:

<template>
<div id="app" @contextmenu="showMenu"
 style="width: 100px;height: 100px;margin-top: 20px;background: red;">
 <vue-context-menu :contextMenuData="contextMenuData"
  @savedata="savedata"
  @newdata="newdata"></vue-context-menu>
</div>
</template>
<script>
export default {
 name: 'app',
 data () {
 return {
  	// contextmenu data (菜单数据)
  contextMenuData: {
  // the contextmenu name(@1.4.1 updated)
  menuName: 'demo',
  // The coordinates of the display(菜单显示的位置)
  axis: {
   x: null,
   y: null
  },
  // Menu options (菜单选项)
  menulists: [{
   fnHandler: 'savedata', // Binding events(绑定事件)
   icoName: 'fa fa-home fa-fw', // icon (icon图标 )
   btnName: 'Save' // The name of the menu option (菜单名称)
  }, {
   fnHandler: 'newdata',
   icoName: 'fa fa-home fa-fw',
   btnName: 'New'
  }]
  }
 }
 },
 methods: {
 showMenu () {
  event.preventDefault()
  var x = event.clientX
  var y = event.clientY
  // Get the current location
  this.contextMenuData.axis = {
  x, y
  }
 },
 savedata () {
  alert(1)
 },
 newdata () {
  console.log('newdata!')
 }
 }
}
</script>

tip:有说不兼容ie的,具体没有测试

到此这篇关于vue添加自定义右键菜单的文章就介绍到这了,更多相关vue添加自定义右键菜单内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
Vue3+elementui plus创建项目的方法
Dec 01 Vue.js
vue+element实现动态加载表单
Dec 13 Vue.js
vue element el-transfer增加拖拽功能
Jan 15 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
vue实现简单数据双向绑定
Apr 28 Vue.js
深入理解Vue的数据响应式
May 15 Vue.js
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
vue3使用vuedraggable实现拖拽功能
Apr 06 Vue.js
vue postcss-px2rem 自适应布局
May 15 Vue.js
vue @ ~ 相对路径 路径别名设置方式
Jun 05 Vue.js
vue中如何自定义右键菜单详解
Dec 08 #Vue.js
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 #Vue.js
vue祖孙组件之间的数据传递案例
Dec 07 #Vue.js
在vue中动态修改css其中一个属性值操作
Dec 07 #Vue.js
在vue中使用inheritAttrs实现组件的扩展性介绍
Dec 07 #Vue.js
vue中利用three.js实现全景图的完整示例
Dec 07 #Vue.js
详解Vue中的自定义指令
Dec 07 #Vue.js
You might like
用 PHP5 轻松解析 XML
2006/12/04 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
javascript fullscreen全屏实现代码
2009/04/09 Javascript
jquery 锁定弹出层实现代码
2010/02/23 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
Node.js实现数据推送
2016/04/14 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
element el-input directive数字进行控制
2018/10/11 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
2018/10/19 Javascript
NodeJs操作MongoDB教程之分页功能以及常见问题
2019/04/09 NodeJs
深入解读Node.js中的koa源码
2019/06/17 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
python爬虫 execjs安装配置及使用
2019/07/30 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
详解FireFox下Canvas使用图像合成绘制SVG的Bug
2019/07/10 HTML / CSS
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
大专自我鉴定范文
2013/10/23 职场文书
医大实习自我鉴定
2013/12/07 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
教师节活动总结
2014/08/29 职场文书
歌颂党的演讲稿
2014/09/10 职场文书
群众路线党员个人剖析材料
2014/10/08 职场文书
催款函范文
2015/06/24 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书
使用Ajax实现无刷新上传文件
2022/04/12 Javascript