react 自定义鼠标右键点击事件

功能:鼠标右键点击节点时,出现"复制"功能,点击其他部位,隐藏"复制";鼠标右键事件的文案,始终在鼠标点击位置的右下方;点击复制,提示复制成功

效果图:

代码:

复制代码
const [showRight,setShowRight] = useState(false);
const contextMenu = useRef(null); 
const [clickX,setClickX] = useState('0px');
const [clickY,setClickY] = useState('0px');

------------

<div className='topology-node' onContextMenu={(e)=> handleRight(e)} >
	这里面是图中的节点,只有右键双击图中节点,才会触发自定义的右键事件功能
</div>

------------

// 鼠标右键展示的内容,注意这里的样式rightStyle,鼠标右键时菜单的位置(图中"复制"的位置)就是靠这个样式控制的
{showRight&&<div className='right-panel' onClick={handleRightCopy} style={rightStyle}>复制</div>}

------------

useEffect(()=>{
	// 监听其他地方的点击事件
    document.addEventListener('click', _handleClick);
})

------------

// 事件
const handleRight =(event:any) =>{
    setShowRight(true)
    // event.clientX event.clientY 鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标)
    setClickX(event.clientX);  
    setClickY(event.clientY);
}
// 右键菜单的位置,加减多少看自己,位置看着舒服就行
const rightStyle = {
    left:`${clickX + 5}px`,
    top: `${clickY + 5}px`
}
const _handleClick =(event:any)=>{
    const wasOutside = !(event.target.contains === contextMenu);
    // 点击其他位置需要隐藏右键菜单
    if (wasOutside) setShowRight(false);
}
const handleRightCopy =()=>{
    console.log('点击了复制');
    message.success('复制成功')
}

css

复制代码
// 样式可以自定义
.right-panel{
  width: 100px;
  z-index:10;
  position: fixed;
  background-color: pink;
  cursor: pointer;
}
相关推荐
先吃饱再说15 小时前
编写一个颜色选择器之后,我理解了 React 工程化的三层架构
react.js·前端框架·前端工程化
先吃饱再说15 小时前
别说你懂 useEffect:从底层机制到生命周期管理,这篇全讲透了
react.js·前端框架
先吃饱再说15 小时前
从“传事件”到“只传值”:React + TypeScript 组件 Props 设计的两次进化
react.js·前端框架·前端工程化
濮水大叔17 小时前
不必把 Vue3 写成“麻花”:从状态碎片到对象协作,重新理解 Zova 的前端心智模型
前端·typescript·vue3·ioc·tsx·zova
退休倒计时21 小时前
【每日一题】LeetCode 45. 跳跃游戏 II TypeScript
算法·leetcode·typescript
TunerT_TQ1 天前
GitHub深度工程评测:Cline 源码级工程评测|65k Star 开源AI编程助手的工程全景
typescript·开源·github·vs code·ai编程助手·开源供应链安全·静态源码审计
Seven_Ting1 天前
React-Hooks笔记
前端·笔记·react.js
meilindehuzi_a1 天前
React Todo 实战:useEffect 生命周期与 localStorage 持久化
前端·javascript·react.js
Revolution612 天前
React 组件重新渲染时,到底重新执行了什么
前端·react.js·面试
林焱_RPAAI2 天前
影刀RPA技术深度:CSS选择器高级实战指南——伪类属性选择器与性能对比完全解析
vue.js·react.js