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

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

相关推荐
萌萌哒草头将军23 分钟前
⚡⚡⚡尤雨溪宣布开发 Vite Devtools,这两个很哇塞 🚀 Vite 的插件,你一定要知道!
前端·vue.js·vite
游离状态的猫11 小时前
JavaScript性能优化实战:从瓶颈定位到极致提速
开发语言·javascript·性能优化
小彭努力中1 小时前
7.Three.js 中 CubeCamera详解与实战示例
开发语言·前端·javascript·vue.js·ecmascript
浪裡遊2 小时前
跨域问题(Cross-Origin Problem)
linux·前端·vue.js·后端·https·sprint
滿2 小时前
Vue3 Element Plus el-tabs数据刷新方法
javascript·vue.js·elementui
LinDaiuuj2 小时前
判断符号??,?. ,! ,!! ,|| ,&&,?: 意思以及举例
开发语言·前端·javascript
敲厉害的燕宝2 小时前
Pinia——Vue的Store状态管理库
前端·javascript·vue.js
Aphasia3112 小时前
react必备JavaScript知识点(二)——类
前端·javascript
玖玖passion2 小时前
数组转树:数据结构中的经典问题
前端
呼Lu噜2 小时前
WPF-遵循MVVM框架创建图表的显示【保姆级】
前端·后端·wpf