我的网站开发技术经验总结 我的网站开发技术经验总结
首页

fangdown

我的网站开发技术经验总结
首页
  • 日记
  • 22
  • 11
fangdown
2022-11-22
目录

react事件冒泡失效-事件争夺权

# react 事件冒泡失效-组件包裹的问题

# 背景

有一个需求使用 dropdown 组件, dropdown 内容自定义,非 Menu 菜单, 点击 icon 触发 dropdown 显示,点击内容区外,关闭弹窗,点击内容区内,不关闭弹窗

# 相关技术

  • react
  • antd
  • dropdown

# 代码

const baseInfo = (
        <div
            className="card-base-info"
            onClick={(e) => {
                e.stopPropagation();
            }}
        >
            内容区域内容区域内容区域内容区域内容区域
        </div>)
// ....
<Dropdown overlay={baseInfo} trigger={["click"]}>
  <span className="card-title-down"></span>
</Dropdown>

# 分析

给内容区域增加了阻止冒泡事件

<div onClick={e => e.stopPropagation()}>

结果: 没生效,点击内容区域仍然关闭了

  • 解决方案 1,增加原生阻止冒泡,不生效
// 日志会被打印,代表执行了
console.log('stop)
e.stopPropagation();
e.nativeEvent.stopPropagation();
e.nativeEvent.stopImmediatePropagation();
  • 苦恼中, 脑细胞思考中,到底是哪里出了问题呢

  • overlay 相关?

# 解决

尝试在 overlay 中增加一个 div 标签包裹内容,猜测可能是组件对 overlay 做了什么不为人知的处理

<Dropdown overlay={<div>{baseInfo}</div>} trigger={["click"]}>
  <span className="card-title-down"></span>
</Dropdown>

刷新页面,发现点击内容区域不关闭弹窗了, 问题得到了解决

那么就是 overlay 对传入的元素做了处理,第一层的事件处理被接手了,导致我们设置的事件冒泡不生效

我们在第二层中做了一下阻止冒泡就生效了

# 总结

思考这个问题, 知道解决问题的思路, 通过阻止冒泡的原理避免被关闭

但在业务使用的过程中, 尤其是使用一些公共组件、外部组件时, 正常设置的代码可能就被污染了,得不到正确的反馈结果

所以一定要逐步分析可能影响结果的过程才能快速准确的解决问题

上次更新: 2022/11/22, 17:19:23
最近更新
01
多分支修复撞车的问题
05-01
02
如何成为架构师
01-23
03
服务器部署全过程
11-23
更多文章>
Theme by Vdoing | Copyright © 2019-2026 fangdown | 粤ICP备19079809号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式