React冒泡和阻止冒泡的应用详解


Posted in Javascript onAugust 18, 2020

阻止事件冒泡分三种:

1:阻止合成事件往最外层document上的事件冒泡,用e.nativeEvent.stopImmediatePropagation();

2: 合成事件间的冒泡,使用 e.stopPropagation();

3:阻止合成事件,往处理document上的其他原生事件冒泡,需要通过e.target来判断,示例代码如下。

import React,{ Component } from 'react';
import ReactDOM,{findDOMNode} from 'react-dom';

class Counter extends Component{
constructor(props){
super(props);

this.state = {
count:0,
    }
  }

handleClick(e){
this.setState({count:++this.state.count});
  }
render(){
return(
<div ref="test">
<p>{this.state.count}</p>
<a ref="update" onClick={(e)=>this.handleClick(e)}>更新</a>
</div>
    )
  }

componentDidMount() {
document.body.addEventListener('click',e=>{
// 通过e.target判断阻止冒泡
      if(e.target&&e.target.matches('a')){
return;
      }
console.log('body');
    })
  }
}

var div1 = document.getElementById('content');

ReactDOM.render(<Counter/>,div1,()=>{});

需求

最近在写react的项目,需要手写一个自定义的菜单,和antd的menu不同,需要点击一级菜单后弹出类似一个Drawer展示二级和三级菜单,且菜单样式自定义,都在一个Drawer里展示。

难点

其中难点在于点击一级菜单时弹出Drawer,点击除Drawer和一级菜单项之外的dom,Drawer收起。

问题

乍一想就是给document添加一个点击事件监听,给Drawer和一级菜单添加阻止冒泡,思路确实如此,后面实现中发现:
react为提高性能,有自己的一套事件处理机制,相当于将事件代理到全局进行处理,也就是说监听函数并未绑定到Dom上。 因此阻止react的事件冒泡e.stopPropagation(),就不发阻止原生事件的冒泡,表现为点击Drawer也会收起Drawer;禁用原生事件冒泡e.nativeEvent.stopPropagation(),React的监听函数就调用不到,表现为点击Drawer以外dom,Drawer不会收起。这些都不是我们想要的。

解决方案

正确的姿势应该是判断event.target对象是否是目标对象或包含目标对象或被包含目标对象,以此来决定是否触发事件

componentDidMount() {
  document.addEventListener('click', this.hideDrawer);
 }

 componentWillUnmount() {
  document.removeEventListener('click', this.hideDrawer);
 }

 hideDrawer = e => {
  const { closeDrawer } = this.props;
  // 找到不需要关闭的dom 一级菜单
  const tabContent = document.querySelectorAll('.ant-menu-submenu-vertical');
  // 找到不需要关闭的dom   Drawer
  const drawerContent = document.querySelector('#menuDrawer');
  // 判断当前点击的dom对象有没有包含在目标dom中
  const isHave = Array.from(tabContent).some(item => item.contains(e.target));
  // 不包含则关闭Drawer 包含就走其他的业务逻辑了
  if (tabContent !== null && !(isHave || drawerContent.contains(e.target))) {
   closeDrawer();
  }
 };

到此这篇关于React冒泡和阻止冒泡的应用详解的文章就介绍到这了,更多相关React冒泡和阻止冒泡内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Javascript 相关文章推荐
javascript 遍历验证所有文本框的值
Aug 27 Javascript
JQuery 写的个性导航菜单
Dec 24 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
Apr 07 Javascript
纯javascript移动优先的幻灯片效果
Nov 02 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
May 28 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
Dec 13 Javascript
webpack配置之后端渲染详解
Oct 26 Javascript
微信小程序实现人脸识别
May 25 Javascript
对angular4子路由&amp;辅助路由详解
Oct 09 Javascript
jquery获取img的src值实例介绍
Jan 16 jQuery
React通过redux-persist持久化数据存储的方法示例
Feb 14 Javascript
javascript数组的定义及操作实例
Nov 10 Javascript
JavaScript数组排序的六种常见算法总结
Aug 18 #Javascript
js实现简单扫雷
Nov 27 #Javascript
基于JavaScript实现大文件上传后端代码实例
Aug 18 #Javascript
javascript实现扫雷简易版
Aug 18 #Javascript
详解Vue的组件中data选项为什么必须是函数
Aug 17 #Javascript
Openlayers实现扩散的动态点(水纹效果)
Aug 17 #Javascript
openLayer4实现动态改变标注图标
Aug 17 #Javascript
You might like
教你如何把一篇文章按要求分段
2006/10/09 PHP
php下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
php设计模式之观察者模式的应用详解
2013/05/21 PHP
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
2019/03/21 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
javascript自定义的addClass()方法
2014/05/28 Javascript
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
2015/01/02 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
JS中生成随机数的用法及相关函数
2016/01/09 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
vue中SPA单页面应用程序详解
2017/11/07 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
Angular6 Filter实现页面搜索的示例代码
2018/12/02 Javascript
微信小程序显示倒计时功能示例【测试可用】
2018/12/03 Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
2019/09/19 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
理解Python中函数的参数
2015/04/27 Python
Python简单获取自身外网IP的方法
2016/09/18 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
对Python 除法负数取商的取整方式详解
2018/12/12 Python
Python爬虫——爬取豆瓣电影Top250代码实例
2019/04/17 Python
Python如何实现动态数组
2019/11/02 Python
pytorch实现线性拟合方式
2020/01/15 Python
俄罗斯护发和专业化妆品购物网站:Hihair
2019/09/28 全球购物
总经理岗位职责
2013/11/09 职场文书
大学生志愿者感言
2014/01/15 职场文书
初中家长寄语
2014/04/02 职场文书
公证书标准格式
2014/04/10 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
土地转让协议书
2014/09/27 职场文书