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;
}

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

相关推荐
一袋米扛几楼9812 分钟前
【网络安全】SIEM -Security Information and Event Management 工具是什么?
前端·安全·web安全
小陈工23 分钟前
2026年4月7日技术资讯洞察:下一代数据库融合、AI基础设施竞赛与异步编程实战
开发语言·前端·数据库·人工智能·python
Cobyte32 分钟前
3.响应式系统基础:从发布订阅模式的角度理解 Vue2 的数据响应式原理
前端·javascript·vue.js
竹林81836 分钟前
从零到一:在React前端中集成The Graph查询Uniswap V3池数据实战
前端·javascript
Mintopia43 分钟前
别再迷信"优化":大多数性能问题根本不在代码里
前端
倾颜43 分钟前
接入 MCP,不一定要先平台化:一次 AI Runtime 的实战取舍
前端·后端·mcp
军军君011 小时前
Three.js基础功能学习十八:智能黑板实现实例五
前端·javascript·vue.js·3d·typescript·前端框架·threejs
恋猫de小郭1 小时前
Android 上为什么主题字体对 Flutter 不生效,对 Compose 生效?Flutter 中文字体问题修复
android·前端·flutter
Moment1 小时前
AI全栈入门指南:一文搞清楚NestJs 中的 Controller 和路由
前端·javascript·后端
禅思院1 小时前
前端架构演进:基于AST的常量模块自动化迁移实践
前端·vue.js·前端框架