vue中怎样实现全局右键菜单的组件,代码是什么
Admin 2022-09-13 群英技术资讯 293 次浏览
前段时间公司在做一个webIDE项目,其中有对文件树的各种操作,主要通过右键菜单实现,今天就来记录一下怎么在vue项目中实现全局的自定义右键菜单。效果如图所示:
注意:
需要在项目中找到页面整体布局的组件,比如项目使用Home.vue作为整个项目的公共布局,将根元素定位设置成relative,使右键菜单相对于其进行定位。
本文的右键菜单主要使用vuex实现
一、vuex中定义全局状态用于管理右键菜单
export default {
/**
* menuContent格式:
* [
* {
* name: '新建文件', // 操作名
* method: 'createDirectory', // 需要执行的对应组件中的方法
* disabled: true // 是否禁用,可以根据页面具体逻辑进行调整
* }
* ]
*
*
* 整体右键菜单采用绝对定位,所以clientX、clientY代表是left和top定位
*/
state: {
menuContent: [], // 右键菜单内容
clientX: '', // left
clientY: '', // top
displayContextMenu: false // 是否展示右键菜单
},
mutations: {
SET_CONTEXT_MENU: (state, payload) => {
state.menuContent = payload.menuContent;
state.clientX = payload.clientX;
state.clientY = payload.clientY;
state.displayContextMenu = payload.displayContextMenu;
},
}
}
二、定义公共组件ContextMenu.vue
<template>
<div class="context-menu" v-show="contextMenu.displayContextMenu"
:style="{'left': contextMenu.clientX + 'px', 'top': contextMenu.clientY + 'px'}">
<ul>
<li v-for="(item, i) in contextMenu.menuContent" :key="i" :class="item.disabled ? 'disabled' : ''"
@click="emitEvent(item.method)">
{{item.name}}
</li>
</ul>
</div>
</template>
<script>
import { mapState } from 'vuex';
import bus from '@/views/common/bus';
export default {
name: 'ContextMenu',
data(){
return {
}
},
computed: {
...mapState(['contextMenu'])
},
methods: {
emitEvent(type){
bus.$emit('operateDirectory', type)
}
}
}
</script>
<style lang="scss" scoped>
.context-menu {
position: absolute;
background: #FFF;
color: #34495E;
min-width: 100px;
box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.2);
border-radius: 2px;
cursor: pointer;
z-index: 1002;
&>ul {
text-align: left;
padding: 5px 10px;
&>li {
padding: 3px 4px;
font-size: 12px;
list-style: none;
height: 24px;
line-height: 24px;
&:hover {
background: #EDF6FF;
}
}
.disabled {
color: #888585;
pointer-events: none;
}
}
}
</style>
三、在组件中使用
import { mapState } from 'vuex';
// ...
computed: {
...mapState(['contextMenu'])
},
created(){
bus.$on('operateDirectory', (param) => {
// 点击右键菜单时,应触发组件内的同名方法,首先应判断该方法是否在本组件内存在,存在则调用
if(this[param]){
this[param]();
}
});
},
// ...
methods: {
showContextMenu(event, data) {
event.preventDefault(); // 阻止浏览器的默认事件
const menuContent = {
menuContent: [
{
icon: "el-icon-upload2",
name: "运行",
method: "run",
},
{
icon: "el-icon-refresh",
name: "编辑",
method: "editConfig",
},
{
icon: "el-icon-refresh",
name: "添加",
method: "addCommond",
},
{
icon: "el-icon-refresh",
name: "删除",
method: "deleteConfig",
},
],
clientX: event.clientX,
clientY: event.clientY,
displayContextMenu: true,
};
this.$store.commit("SET_CONTEXT_MENU", menuContent);
// 再次点击页面,右键菜单消失
document.onclick = (event) => {
this.$store.commit("SET_CONTEXT_MENU", {
displayContextMenu: false,
});
};
},
run(){
// ...
},
editConfig(){
// ...
},
addCommond(){
// ...
},
deleteConfig(){
// ...
}
}
总结
这种可以实现全局右键菜单,并且支持自定义右键内容,但是vue3.0对event bus的取消会导致不可用。
目前有一种优化方法:项目中对应会使用组件库,例如element ui,在定义contextMenu.vue的时候,使用dialog,将内容定义在Popover 弹出框中,当组件使用右键菜单时,使用子组件的方式使用ContextMenu.vue,点击右键菜单内容时就不需要使用emit触发了。
关于“vue中怎样实现全局右键菜单的组件,代码是什么”的内容今天就到这,感谢各位的阅读,大家可以动手实际看看,对大家加深理解更有帮助哦。如果想了解更多相关内容的文章,关注我们,群英网络小编每天都会为大家更新不同的知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在使用element-ui的时候,有一个常用的组件,那就是el-popover,本文就介绍一下elementui的el-popover修改样式不生效的解决方法,感兴趣的可以了解一下
jquery prev()方法用于返回跟选定元素同级的上一个元素,并不是上一级元素,请注意!下面是jquery prev函数的使用示例,如下。 html代码部分 div父级div文本内容divid=one第一个div子元素/divdivid=two第二个div子元素/div/div jquery prev方法使用格式 //el
方法:1、利用“$(li元素)”语句匹配li对象;2、利用“:eq()”选择器选取指定的li节点,语法“li对象.eq(位置值)”;3、利用attr()方法为指定li节点添加属性,语法“li节点.attr(“新属性名”,“新属性值”)”。
jQuery怎么样移除click事件?在jquery中,我们可以利用unbind()方法去掉click事件,文中有具体的实现代码,有需要的朋友可以参考,接下来跟随小编一起来学习一下吧。
Vue3 在经过多个开发版本的迭代后,终于迎来了它的正式版本,下面这篇文章主要给大家介绍了关于如何使用vue3实现一个人喵交流小程序的相关资料,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008