React中右击出现自定弹窗

前言

在react中点击右键,完成阻止浏览器的默认行为,完成自定义的悬浮框(Menu菜单).

版本

"react": "^18.2.0",

"@umijs/route-utils": "^4.0.1",

"antd": "^5.18.1",

"@ant-design/pro-components": "^2.4.4",

效果

代码

第一种方式(display属性block/none)

1. 页面代码

javascript 复制代码
  // 鼠标右击事件,显示右击的相关菜单数据
  const [contextMessage, setContextMessage] = useState(null);

  const hideContextMenu = () => {
    const menu: any = document.getElementById('context-menu');
    if (menu) {
      menu.style.display = 'none';
    }
  };

  const handleRowContextMenu = (record) => (e: React.MouseEvent) => {
    e.preventDefault(); //阻止默认行为
    const menu: any = document.getElementById('context-menu'); //获取元素
    menu.style.display = 'block'; //显示下面的div
    menu.style.left = (e.pageX - 250) + 'px';  // 可以减去一些像素,比如10
    menu.style.top = (e.pageY - 180) + 'px';  // 减去10像素
    setContextMessage(record); //这个是设置点击的这一项的所有值
    document.addEventListener('click', hideContextMenu); //监听
  };

  const handleMenuItemClick = (option: string) => {
    alert(option); // 处理菜单项点击
    hideContextMenu(); // 点击后隐藏菜单
    //后续操作.........
  };

<ProTable
     rowKey='workId'
     key='workList'
     onRow={(record, rowIndex) => {
        return { onContextMenu: handleRowContextMenu(record), // 添加右键事件 
         }
    }}/>
<div id="context-menu">
    <ul>
       <li onClick={() => handleMenuItemClick('新增同级')}>新增同级</li>
       <li onClick={() => handleMenuItemClick('新增子集')}>新增子集</li>
    </ul>
</div>

2.css代码

css 复制代码
#context-menu {
    display: none;
    position: absolute;
    border: 1px solid #ccc;
    background-color: white;
    box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.2);
    z-index: 1000;
}
#context-menu ul {
    list-style-type: none;
    margin: 0;
    padding: 0;
}
#context-menu ul li {
    padding: 8px 12px;
    cursor: pointer;
}
#context-menu ul li:hover {
    background-color: #f0f0f0;
}

第二种方式(设置状态显示/隐藏)

相关推荐
AlienZHOU5 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
刺客码8 小时前
Layui 表格固定列行高错位问题解决方案
前端框架·layui·jquery·web
Captaincc9 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
计算机魔术师10 小时前
德国Wiki被黑后两周,OpenAI终于把模型失控的账本摊开了
前端
kyriewen10 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程
IT_陈寒11 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端
前端snow11 小时前
ai agent --- 多agent框架之图编排引擎-langgraph
前端
竹林81811 小时前
OmniPic Studio v3.2.1 核心技术架构与全平台发版解析文档
前端·浏览器
JamesZhang8007811 小时前
页面内存只涨不跌? 一次泄漏排查, 牵出 WeakMap 的诞生
前端
Z小明11 小时前
第 6 章 组件进阶
前端·vue.js