vue实现右键弹出菜单

在最近工作中,有一个需求,需要做一个表格,并且对该表格右键弹出菜单支持增删改,这里做下总结,功能截图如下:

首先定义菜单结构

<!-- 菜单 -->
<div class="menu-list" :style="{position:'fixed',top:top+'px',left:left+'px'}" v-if="visible">
    <div class="menu" v-for="(item,index) in menuList">
         <div v-if="item=='插入图片'||item=='更换图片'">
             <el-upload class="upload-demo"
                         action=""
                         :accept="$pubTool.UPLOADIMGFORMAT"
                         :auto-upload="false"
                         :show-file-list="false"
                         :limit="1"
                         :on-exceed="(files) => { selectedFileMore(files, 'img', 'script_filePath', 0,0, 1, 'NONE', false); addImg(); }"
                         :on-change="(file) => { selectedFile(file, 'img', 'script_filePath', 0,0, 1, 'NONE', false); addImg(); }">
                        <div>{{item}}</div>
                    </el-upload>
                </div>
                <div v-if="item=='插入视频'||item=='更换视频'">
                    <el-upload class="upload-demo"
                         action=""
                         :accept="$pubTool.UPLOADVIDEOFORMAT"
                         :auto-upload="false"
                         :show-file-list="false"
                         :limit="1"
                         :on-exceed="(files) => { selectedFileMore(files, 'video', 'script_filePath', 1,1, 1, 'script_fileCover', true); addVideo(); }"
                         :on-change="(file) => { selectedFile(file, 'video', 'script_filePath', 1, 1,1, 'script_fileCover', true); addVideo(); }">
                        <div>{{item}}</div>
                    </el-upload>
                </div>
                <div v-if="item=='插入附件'||item=='更换附件'">
                    <el-upload class="upload-demo"
                          action=""
                          :accept="$pubTool.UPLOADSCRIPTFORMAT"
                          :auto-upload="false"
                          :show-file-list="false"
                          :limit="1"
                           multiple
                           :on-exceed="(files) => { selectedFileMore(files, 'annex', 'script_filePath', 4,1, 1, 'script_fileCover', true); addAnnex(); }"
                           :on-change="(file) => { selectedFile(file, 'annex', 'script_filePath', 4, 1,1, 'script_fileCover', true); addAnnex(); }">
                        <div>{{item}}</div>
                    </el-upload>
                </div>
                <div v-if="item=='插入链接'||item=='更换链接'" @click="operHref.ifShow = true">
                    {{item}}
                </div>
                <div v-if="item=='清空单元格'" @click="clearCell">
                    {{item}}
              </div>
       </div>
</div>

js代码

data() {
            return {
           
                visible: false,//菜单隐藏控制
                td_index: 0,//当前点击的单元格列下标
                tr_index: 0,//当前点击的单元格行下标
                top: 0,
                left: 0,
                menuList: ["插入图片", "插入视频", "插入链接", "插入附件", "更换图片", "更换视频", "更换链接", "更换附件", "清空单元格"],
            
            }
        },
        watch: {
            //监听visible的变化,来触发关闭右键菜单,调用关闭菜单的方法
            visible(value) {
                if (value) {
                    document.body.addEventListener('click', this.closeMenu)
                } else {
                    document.body.removeEventListener('click', this.closeMenu)
                }
            }
        },
         //鼠标右键事件--打开菜单
            openMenu(e, item, td_index, tr_index) {
                if (item.ifR || this.action == 'detail' || this.action == 'version' || item.cU == 1) return;
                if (item.ifR == 0 && item.cT == 22860 && item.cV.cD) this.menuList = ["清空单元格"];
                if (item.ifR == 0 && item.cT == 22861 && item.cV.cD) this.menuList = ["更换图片", "清空单元格"];
                if (item.ifR == 0 && item.cT == 22862 && item.cV.cD) this.menuList = ["更换视频", "清空单元格"];
                if (item.ifR == 0 && item.cT == 22863 && item.cV.cD) this.menuList = ["更换链接", "清空单元格"];
                if (item.ifR == 0 && item.cT == 22864 && item.cV.cD) this.menuList = ["更换附件", "清空单元格"];
                if (item.ifR == 0 && (item.cT == 22860 || item.cT == 22861 || item.cT == 22862 || item.cT == 22863 || item.cT == 22864) && item.cV.cD == '') this.menuList = ["插入图片", "插入视频", "插入链接", "插入附件", "清空单元格"];
                //this.rightClickItem = item;
                let x = e.clientX;
                let y = e.clientY;
                this.top = y;
                this.left = x;
                this.td_index = td_index;
                this.tr_index = tr_index;
                this.visible = true;
            },
            //鼠标右键事件--关闭菜单
            closeMenu() {
                this.visible = false;
            },

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

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

    一.写原生方法 1.在所编辑的页面,需要添加右键菜单的元素,绑定contextmenu事件,如下: <li v-for="item in resourceList" :key="item.id" @click="handleClickFolder(item)" @contextmenu.prevent="openMenu($event,item)" > ... </li> 2.在页面编写右键菜单内容:

  • Vue+element-ui添加自定义右键菜单的方法示例

    1.在所编辑的页面,需要添加右键菜单的元素,绑定contextmenu事件 <template> <el-button size="medium" @contextmenu.prevent.native="openMenu($event)"> ...... </template> 2.在页面编写右键菜单内容 <ul v-show="visible" :style="{left:left+'px'

  • vue实现自定义全局右键菜单

    前段时间公司在做一个webIDE项目,其中有对文件树的各种操作,主要通过右键菜单实现,今天就来记录一下怎么在vue项目中实现全局的自定义右键菜单.效果如图所示: 注意: 需要在项目中找到页面整体布局的组件,比如项目使用Home.vue作为整个项目的公共布局,将根元素定位设置成relative,使右键菜单相对于其进行定位. 本文的右键菜单主要使用vuex实现 一.vuex中定义全局状态用于管理右键菜单 export default {     /**      * menuContent格式:  

  • vue中如何自定义右键菜单详解

    在所编辑的页面,需要添加右键菜单的元素,绑定contextmenu事件,如下: <li v-for="item in resourceList" :key="item.id" @click="handleClickFolder(item)" @contextmenu.prevent="openMenu($event,item)" > </li> 在页面编写右键菜单内容: <ul v-show=&q

  • vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单

    今天分享的不是技术,今天给大家分享个插件,针对现有的vue右键菜单插件,大多数都是需要使用插件本身自定义的标签,很多地方不方便,可扩展性也很低,所以我决定写了一款自定义指令调用右键菜单(vuerightmenu) 安装  npm install rightmenu --save-dev   开始 //main.js import vue from "vue"; import rightMenu from "rightMenu"; vue.use(rightMenu)

  • Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)

    最近做的一个项目是基于 vue + AntDesign 的.由于项目要求,需要在 Table 组件的行内点右键的时候弹出菜单.在线演示地址及最终效果图如下: 在线演示地址>> 首先新建一个Table组件的实例: <a-table :columns="columns" :rowKey="record => { return record.INDEX;}" :dataSource="tableData" /> ... c

  • 原生Vue 实现右键菜单组件功能

    Vue 原生实现右键菜单组件, 零依赖 快速安装 npm install vue-contextmenujs 使用 测试中使用的是 element-ui 图标 import Contextmenu from "vue-contextmenujs" Vue.use(Contextmenu); <template> <div id="app" style="width:100vw;height:100vh" @contextmenu

  • vue实现右键菜单栏

    本文实例为大家分享了vue实现右键菜单栏的具体代码,供大家参考,具体内容如下 vue实现右键菜单栏和原生js大同小异,都是需要明白两个点 1.contextmenu事件是鼠标的右键点击事件2.要阻止浏览器的默认右键事件 代码如下 // methods rightShow() {     let menu = this.$refs.msgRightMenu     this.isPersoncontextMenus = true     var evt = event || window.even

  • vue2.0的contextmenu右键弹出菜单的实例代码

    整理文档,搜刮出一个vue2.0的contextmenu右键弹出菜单的实例代码,稍微整理精简一下做下分享. 1.事情对象 <!DOCTYPE html> <html> <head> <title></title> <meta charset="utf-8"> <script src="http://unpkg.com/vue/dist/vue.js"></script>

  • 1分钟Vue实现右键菜单

    目录 效果图 安装 代码实现 自定义样式 总结 高效实现需求,避免重复造轮子.今天给大家分享的是,如何在最短的时候内实现右键菜单.方法也很简单,一个插件就可以搞定,话不多说,上效果图: 效果图 安装 npm install vue-contextmenujs 或 yarn add vue-contextmenujs 使用 import Contextmenu from "vue-contextmenujs" Vue.use(Contextmenu); 代码实现 以element-ui图

随机推荐