vue点击鼠标右键自定义菜单弹窗

主题思路:点击鼠标右键(@contextmenu.prevent阻止右键菜单(浏览器行为)),获取当前鼠标点击的坐标位置,展示自定义菜单。

1.html部分

        <div class="leftTree">
            <div class="top">
                <div style="display:flex">
                    <div class="imgBox"><img src="../../assets/img/bm.png" alt=""></div>
                    <span style="line-height:35px;">部门</span>
                </div>
                <div style="line-height:35px;color:#299d26">右键[新增/修改]</div>
            </div>
            <el-tree :data="dataTree" :props="defaultProps" accordion @node-click="handleNodeClick">
                <span class="custom-tree-node" slot-scope="{ node, data }" @contextmenu.prevent="open($event, data)">
                    <span>
                        <i :class="data.icon"></i>{{ data.title }}
                    </span>
                </span>
            </el-tree>
            <!-- 通过右击获取到的坐标定位 -->
            <ul v-show="visible" :style="{ left: left + 'px', top: top + 'px' }" class="newcontextmenu">
                <li @click="addDepartment('新增下级')"><i class="el-icon-plus" style="color:#1e9fff"></i> 新增下级</li>
                <li @click="addDepartment('新增同级')"><i class="el-icon-plus" style="color:#1e9fff"></i>新增同级</li>
                <li @click="modify"><i class="el-icon-edit" style="color:#fcc465"></i>编辑</li>
                <li @click="deleteDepartment"><i class="el-icon-delete" style="color:red"></i>删除</li>
            </ul>
        </div>
<style lang="scss">
.leftTree {
        width: 15%;

        .top {
            display: flex;
            justify-content: space-between;
            border-bottom: 3px solid #1e9fff;
            font-size: 14px;

            .imgBox {
                width: 30px;
                height: 30px;

                img {
                    width: 100%;
                    height: 100%;
                }
            }
        }
    }
</style>

2.js内容

<script>
export default {
    components: {},
    data() {
        return {
            //以下是自定义菜单数据
            visible: false,
            top: 0,
            left: 0,
        }
    },
    methods: {
        //右击编辑或修改菜单栏
        open(e, data) {
            this.clickData = data
            var x = e.pageX + 50; //这个应该是相对于整个浏览器页面的x坐标,左上角为坐标原点(0,0)
            var y = e.pageY; //这个应该是相对于整个浏览器页面的y坐标,左上角为坐标原点(0,0)
            this.top = y;
            this.left = x;
            this.visible = true; //显示菜单
            //右击全部不展示右击新增菜单
            if (data.title == "全部") {
                this.visible = false;
            }
        },
        //关闭菜单
        closeMenu() {
            this.visible = false;
        },
    },
    watch: {
        //   监听属性对象,newValue为新的值,也就是改变后的值
        visible(newValue) {
            if (newValue) {
                //菜单显示的时候
                // document.body.addEventListener,document.body.removeEventListener它们都接受3个参数
                // ("事件名" , "事件处理函数" , "布尔值");
                // 在body上添加事件处理程序
                document.body.addEventListener("click", this.closeMenu);
            } else {
                //菜单隐藏的时候
                // 移除body上添加的事件处理程序
                document.body.removeEventListener("click", this.closeMenu);
            }
        },
    },
}
</script>

3.效果图

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值