首页 > 其他分享 >vue - 选项卡右击下拉框

vue - 选项卡右击下拉框

时间:2024-10-24 15:11:43浏览次数:1  
标签:右击 vue 选项卡 name dropdown 事件 下拉框

在 element-ui 环境下,给选项卡添加右击事件,是相当麻烦的一件事情,

主要是麻烦,很多东西都需要注意,并没有太多难点。

注意项

el-tabs 的右击事件

事件的名称是 contextmenu.prevent.native,这个很快就能找到,需要注意的是:

选项卡整个头部都能触发右击事件,需要过滤出哪些事件是由选项卡触发的。

右击下拉框实现方案

只需要在界面隐藏一个下拉框,点击的时候,获取点击位置信息,将下拉框显示在该位置即可。

获取 e.target 的 clientX/clientY 属性,动态控制面板的 left/top 即可,

这种方式,也可以用在很多吸附弹窗上,还需要注意的是 z-index,避免沉在界面底部。

关闭下拉框

弹出下拉框之后,需要有一个对应的关闭事件,不论点击哪里,都要触发关闭事件。

这时候,要给 windows 对象,添加 mousedown 事件。

mousedown 事件冲突

添加 mousedown 事件之后,就会发现下拉框中的点击事件,是触发不了的;

因此,要通过 e.target 的属性,判断点击事件是否属于下拉框。

代码样例

下面只包含核心代码,可能有一些错误,照着意思改改。

<template>
  <div style="">
    <div v-show="dropdown_visible" :style="style" class="sea-dropdown-menu">
      <p class="el-dropdown-menu__item" id="sea-tabs-close-current">关闭当前</p>
      <p class="el-dropdown-menu__item" id="sea-tabs-close-left">关闭左边</p>
      <p class="el-dropdown-menu__item" id="sea-tabs-close-right">关闭右边</p>
      <hr/>
      <p class="el-dropdown-menu__item" id="sea-tabs-close-other">关闭其他</p>
      <p class="el-dropdown-menu__item" id="sea-tabs-close-all">关闭所有</p>
    </div>

    <el-tabs type="card" v-model="current_tabs_name"
             @contextmenu.prevent.native="onTabRightClick">
		<el-tab-pane label="用户管理" name="first">用户管理</el-tab-pane>
    </el-tabs>
  </div>
</template>

<script>

/**
 * 中央选项卡
 */
export default {
    name: "center-tabs"
    , data() {
        return {
            // 右击菜单可见性
            dropdown_visible: false
            // 触发下拉事件的选项卡 name
            , dropdown_name: undefined
            // 右击菜单位置
            , left: undefined
            // 右击菜单位置
            , top: undefined

        }
    },
    computed: {
        /**
         * 样式
         */
        style: function () {
            return "left: " + this.left + "px; top: " + this.top + "px;";
        }
    },
    mounted() {
        // 落下鼠标时,需要移除展开的右击菜单
        window.addEventListener('mousedown', this.onWindowsMousedown);
    },
    methods: {       
        /**
         * 关闭选项卡右击菜单
         *
         * 下拉列表的点击事件与当前事件冲突,在这个事件里触发点击事件
         */
        onWindowsMousedown: function (e) {
            let clazz = e.target.getAttribute('class');
            let id = e.target.getAttribute('id');
            if (clazz === 'el-dropdown-menu__item') {
                // todo sth.
            }

            this.dropdown_visible = false;
            this.dropdown_name = undefined;
        },

        /**
         * 右击事件 - 打开选项卡右击菜单
         *
         * name 记录在标签的 aria-controls 字段,格式为 "pane-[name]"
         *
         * @param e 事件
         */
        onTabRightClick(e) {
            if (e.target.id !== '') {
                let controls = e.target.getAttribute('aria-controls');
                if (controls.length > 5) {
                    this.dropdown_name = controls.substring(5);
                    console.log(this.dropdown_name);
                    this.dropdown_visible = true;
                    this.left = e.clientX;
                    this.top = e.clientY;
                } else {
                    // 不合常理的右击事件
                    console.error('unknown aria-controls: ' + controls);
                }
            }
        }
    }
    , destroyed() {
        // 移除鼠标落下的侦听事件
        this.dropdown_visible = false;
        window.removeEventListener('mousedown', this.onWindowsMousedown);
    }
}
</script>

<style scoped>
.sea-dropdown-menu {
    position: fixed;
    width: 150px;
    background-color: #fff;
    z-index: 1024;
    border-radius: 3px;
    -webkit-box-shadow: 1px 2px 10px #ccc;
    box-shadow: 1px 2px 10px #ccc;
}
</style>

标签:右击,vue,选项卡,name,dropdown,事件,下拉框
From: https://www.cnblogs.com/chenss15060100790/p/18499645

相关文章

  • vue - 自定义吸附窗口
    业务需求以共享单车界面为例,地图上分布着大量的共享单车,鼠标悬浮在单车上,弹出一个吸附弹窗,内容显示单车详细信息。分析很明显,因为单车的数量可能非常多,我们不可能用显示隐藏的方式实现;合理的做法是,所有单车公用一个弹窗面板,悬浮的时候刷新面板上的数据。方案看着改吧,element......
  • 基于SpringBoot和Vue的地方美食分享与推荐网站的设计与实现(源码+定制+开发)地方美食推
    博主介绍:  ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生......
  • 基于springboot+vue的Hadoop的高校教学资源平台的设计与实现(源码+lw+部署文档+讲解等
    课题摘要基于SpringBoot+Vue的Hadoop高校教学资源平台是一个功能强大的教学资源管理系统,结合了先进的技术架构和丰富的功能模块,为高校教学提供了高效、便捷的资源共享和管理平台。以下是该平台的设计与实现方案,包括源码、LW(LiveWire)、部署文档和讲解等内容。一、......
  • 基于Hadoop的热门游戏推荐系统的设计springboot+vue的项目(源码+lw+部署文档+讲解等)
    课题摘要基于SpringBoot+Vue的Hadoop热门游戏推荐系统可以为游戏玩家提供个性化的游戏推荐服务。以下是该系统的设计与实现方案:一、系统功能用户管理用户注册与登录:支持多种注册方式,如手机号码、邮箱等。用户登录后可以管理个人信息。用户偏好设置:用户可以设置......
  • 基于springboot+vue的Hadoop的奶茶数据平台系统(源码+lw+部署文档+讲解等)
    课题摘要基于SpringBoot+Vue的Hadoop奶茶数据平台系统可以为奶茶行业提供全面的数据管理和分析解决方案。以下是该系统的设计与实现方案:一、系统功能数据采集与存储从各种数据源(如门店销售系统、社交媒体、市场调研等)采集奶茶相关数据。使用Hadoop分布式文件......
  • 基于springboot+vue的Hadoop的环境质量数据修复系统设计与实现(源码+lw+部署文档+讲解
    课题摘要基于SpringBoot+Vue的Hadoop环境质量数据修复系统是一个用于处理和修复环境质量数据的强大工具。以下是该系统的设计与实现方案,包括源码、LW(LiveWire)、部署文档和讲解等内容。一、系统概述环境质量数据对于环境保护和决策制定至关重要。然而,由于各种原因......
  • VUEJS实例中DATA属性的三种写法及区别是什么
    Vue.js是一种流行的JavaScript前端框架,用于构建交互式的用户界面。VUEJS实例中DATA属性的三种写法及区别是:1、独立性;2、推荐性;3、ES6语法。其中,独立性是指,使用函数返回一个对象的写法确保了每个组件实例都拥有独立的数据,不会相互影响。而直接使用对象声明DATA属性的写法会导致数......
  • js 富文本转义及反转义(包含vue版本的)
    //js//富文本反转义htmlfunctionescape2Html(str){  vararrEntities={'lt':'<','gt':'>','nbsp':'','amp':'&','quot':'"'};returnst......
  • vue项目搭建-vite版本
    https://blog.csdn.net/panghuangang/article/details/138756363 npmcreatevite@latest和npminitvite@latest命令是等效的,npmcreate是npminit的别名,它们的作用都是使用create-vue创建一个基于Vite的项目。npmcreatevite@latest这个命令实际上是先安装create-vite这个......
  • 基于SpringBoot + Vue的G县乡村生活垃圾治理问题中运输地图的设计与实现
    文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言......