前置知识:
- React的合成事件系统:reactv17之前,事件代理到document上,react17和react18中,则委托到根节点。冒泡阶段执行。
- 执行顺序为:原生dom事件-》React合成事件-》原生ducument事件
引用- React合成事件封装了stopPropagation方法,e.stopPropagation可以阻塞合成事件之间的冒泡,不能阻止合成事件冒泡到原生ducument监听,因为stopPropagation只能阻止事件冒泡至其父节点
引用- stopPropagation是只能阻止事件冒泡至其父节点,而stopImmediatePropagation既能阻止事件冒泡至父节点,也能阻止当前节点上其他同类型事件的触发,阻止的同类型事件需要是后绑定的
- 注意react合成事件并没有封装stopImmediatePropagation,有需要用e.nativeEvent.stopImmediatePropagation
问题: 点击页面任意空白处,关闭弹框
需注意:不要影响到弹框内部的点击事件
两种方案:
- 在原生ducument上监听click事件,捕获到就关闭弹框
在弹框内部绑定的click事件中阻止冒泡,reactv17前用e.nativeEvent.stopImmediatePropagation, reactv17和reactv18用e.stopPropagation - 在弹框和页面之间设置一个覆盖整个页面的透明蒙层,点击蒙层就关闭弹框
对于方案1中需要注意React的版本区分
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。