react 阻止事件冒泡
前言
在学习react阻止事件冒泡,需要先了解 合成事件 和 原生事件
合成事件:在jsx中直接绑定的事件,就是合成事件;
原生事件: 通过js原生代码绑定的事件,就是原生事件;
react事件:react有自己的一套事件处理机制,它将所有事件都绑定在document上,然后再用dispatchEvent来分发,这时候分发的就是合成事件
实际是document上绑定了两个事件:
// react 合成事件, dispatchEvent里面执行回调函数
document.addEventListener('click', dispatchEvent); // 浏览器原生
document.addEventListener('click', () => {
alert('document click');
})
举栗子(什么是合成事件和原生事件的例子):
import * as React from 'react'
export default class IndicatorItem extends React.Component {
componentDidMount () {
// 这就是原生事件
document.addEventListener('click', this.click)
}
click = (e) => {
console.log('原生click', e)
if (e.target.className !== 'indicator_item' && e.target.parentElement.className !== 'indicator_item') {
// debugger
clearIndicatorDetail()
}
e.stopPropagation()
}
handleClick=(id, status, e) => {
console.log('合成事件')
// 阻止事件冒泡,(阻止这个合成事件,往document上冒泡,因此不会触发click方法)
e.nativeEvent.stopImmediatePropagation()
// 阻止合成事件间的冒泡,不会往最外层的div的test方法冒了,如果不加这句代码,就会冒泡至外层div,执行test方法。
}
render () {return (
<div onClick={this.test}>
{
indicators.map((item, index) => {
return (
<div className='indicator_item' key={`item${index}`} onClick={(e) => this.handleClick(item.id, item.status, e)}>
{ item.status === 1 ? null : (<Tooltip title={iconWordMap[item.status]} style={{ marginLeft: '-20px' }}>
<Icon name={iconMap[item.status]} style={{ marginRight: 8, color: item.status === 0 ? '#FFD738' : '#82868C' }} />
</Tooltip>) }
<span className='indicator_item_nickname'>{item.nickname}</span>
</div>
)
})
}
</div>
)
}
}
正文:
阻止事件冒泡分三种:
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,()=>{});
参考文章:https://zhuanlan.zhihu.com/p/26742034 和 https://segmentfault.com/a/1190000013343819
react 阻止事件冒泡的更多相关文章
- 深入React事件系统(React点击空白部分隐藏弹出层;React阻止事件冒泡失效)
只关注括号内问题的同学,可直接跳转到蓝字部分.(标题起的有点大,其实只讨论一个问题) 两个在React组件上绑定的事件,产生冲突后,使用e.stopPropagation(),阻止冒泡,即可防止事件冲 ...
- React阻止事件冒泡的正确打开方式
需求:点击导航list按钮出现侧弹框,点击空白处弹框消失 问题:绑定空白处的点击事件到document上,但是非空白处的点击也会触发这个点击事件,在react中如何阻止事件冒泡? 解决方法:e.sto ...
- React 中阻止事件冒泡的问题
在正式开始前,先来看看 JS 中事件的触发与事件处理器的执行. JS 中事件的监听与处理 事件捕获与冒泡 DOM 事件会先后经历 捕获 与 冒泡 两个阶段.捕获即事件沿着 DOM 树由上往下传递,到达 ...
- JQuery阻止事件冒泡
冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件. 我们在平时的开发过程中,肯定会遇到在一个div(这个div可以是元素)包裹一个div的情况,但是呢,在这两个div上都添加了事件,如果点 ...
- JS阻止事件冒泡
在使用JS事件的时候,外层元素事件有可能被里层元素的事件触发,例如点击里层元素外层也触发了点击,这种现象称为事件冒泡.(李昌辉) <div id="wai"> < ...
- 阻止事件冒泡,阻止默认事件,event.stopPropagation()和event.preventDefault(),return fal的区别
今天来看看前端的冒泡和事件默认事件如何处理 1.event.stopPropagation()方法 这是阻止事件的冒泡方法,不让事件向documen上蔓延,但是默认事件任然会执行,当你掉用这个方法的时 ...
- javascript里阻止事件冒泡
如下图所示,灰色块包含红色块,假设我们为灰色和红色块各绑定一个单击弹框事件,当我们点击红色块时,不希望触发灰色块的弹框事件,这就需要阻止冒泡事件了. IE里阻止冒泡事件使用cancelBubble属性 ...
- js阻止冒泡及jquery阻止事件冒泡示例介绍
js阻止冒泡 在阻止冒泡的过程中,W3C和IE采用的不同的方法,那么我们必须做以下兼容. 复制代码 代码如下: function stopPro(evt){ var e = evt || window ...
- js区分鼠标单双击 阻止事件冒泡
function clickOrDblClick(obj) { count++; if (obj != undefined) { var rowStr = $.trim($(obj).find(&qu ...
随机推荐
- MVC是什么
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码 ...
- 与JMeter的第一次亲密接触
postman和JMeters是外部接口测试的两个工具,通过界面化的方法,来实现操作http报文携带的请求字段.VK值.json.cookie.header值及文件.本篇主要介绍JMeter. 测 ...
- SSIS - 6.序列容器和优先约束
一.多样的优先约束(看例子) 1)打开一个空白的SSIS包,拖拽4个脚本任务到设计面板上,重命名后连接起来,如下图所示. 2)执行包,可以看到任务执行成功.之后我们改变C和D之间的优先约束为“失败”. ...
- [安卓] 20、基于蓝牙BLE的广播包高频快速搜索
前言: 之前介绍过很多蓝牙beacon.搜索.连接.通讯的文章.不过最近我发现:之前写的蓝牙广播包搜索的工程,搜索频率太慢,而且不能一直保持搜索状态.因此,这里探讨下高频蓝牙广播包扫描 -- 蓝牙BL ...
- emWin仪表界面设计,含uCOS-III和FreeRTOS两个版本
第7期:多功能仪表界面设计配套例子:V6-912_STemWin提高篇实验_多功能仪表界面设计(uCOS-III)V6-913_STemWin提高篇实验_多功能仪表界面设计(FreeRTOS) 例程下 ...
- 工作随笔—Java容器基础知识分享(持有对象)
1. 概述 通常,程序总是运行时才知道的根据某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型,为解决这个普遍的编程问题:需要在任意时刻和任意位置创建任意数量的对象,所以,就 ...
- http初探
http超文本传输协议 一.版本差异: 版本分0.9 1.0 1.1 2.0 http0.9/1.0已经过时:目前主要是1.1版本的,2.0版本的还没普及. http1.1 ----在同 ...
- Shell获取时间,日期,上月,当月,下月
#当前日期 $ date +%F #当前时间$ date +"%F %H:%M:%S" #昨日$ date -d yesterday +%F #上一个月 $ date -d &qu ...
- docker 常用命令记录
下载镜像 docker pull imagesName 查看所有镜像 docker images 查看当前运行的镜像 docker ps 运行镜像 docker run imagesName 停止运行 ...
- 理解和使用Promise.all和Promise.race
一.Pomise.all的使用 Promise.all可以将多个Promise实例包装成一个新的Promise实例.同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回 ...