需求:点击导航list按钮出现侧弹框,点击空白处弹框消失

问题:绑定空白处的点击事件到document上,但是非空白处的点击也会触发这个点击事件,在react中如何阻止事件冒泡?

解决方法:e.stopPropagation()并不奏效,react有专属的阻止事件冒泡方法,e.nativeEvent.stopImmediatePropagation()

示例:

/**
* Created by sunzhuoyi on 17/3/6.
*/
import React from 'react';
import {connect} from 'react-redux';
import {autobind} from 'core-decorators';
import {pushState} from 'redux-router';
import Store from '@comynli/store';
import {Menu, Icon, Row, Col, Dropdown, Button, Affix} from 'antd'; @connect(state => ({}),{pushState}) export default class Common extends React.Component {
constructor(props){
super(props);
this.state = {
current:'index',
barDisplay:true
}
} componentDidMount(){
document.onclick=this.handleBarDisplayShow;
} @autobind
handleClick(e) {
this.setState({
current: e.key,
});
} @autobind
handleInLineClick(e) {
this.setState({
current: e.key,
});
} @autobind
handleBarDisplay(e){
e.nativeEvent.stopImmediatePropagation();
this.setState({barDisplay:false})
} @autobind
handleBarDisplayShow(){
e.nativeEvent.stopImmediatePropagation();
this.setState({barDisplay:true})
} render() {
const SubMenu = Menu.SubMenu;
const MenuItemGroup = Menu.ItemGroup;
return(
<div style={{width:'100%'}}>
<Affix>
<Menu onClick={this.handleClick}
mode="horizontal"
style={{lineHeight:'60px',paddingLeft:'20px'}}
>
{
this.state.barDisplay === true ? <Menu.Item key="bars" >
<Icon type="bars" onClick={e => this.handleBarDisplay(e)}/>
</Menu.Item> : <span></span>
}
<Menu.Item key="Poseidon">
<a href="/"><b>Poseidon</b></a>
</Menu.Item>
</Menu>
</Affix>
{
this.state.barDisplay === false ?
<Menu onClick={this.handleInLineClick}
style={{width: 240, paddingLeft: '20px', height: '1500px'}}
mode="inline"
>
<Menu.Item key="Project">
<a href="/">Project</a>
</Menu.Item>
<Menu.Item key="ProjectTwo">
<a href="/">Project</a>
</Menu> : <span></span>
} </div>
)
}
}

React阻止事件冒泡的正确打开方式的更多相关文章

  1. react 阻止事件冒泡

    前言 在学习react阻止事件冒泡,需要先了解 合成事件 和 原生事件 合成事件:在jsx中直接绑定的事件,就是合成事件: 原生事件: 通过js原生代码绑定的事件,就是原生事件: react事件:re ...

  2. jquery阻止事件冒泡的3种方式

    第一种:return false, 缺点:直接返回了函数,函数后面的语句没法执行了: $('.btn').on('click',function(event){ do something ... re ...

  3. JQuery中阻止事件冒泡的两种方式及其区别

    JQuery 提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation(); $("#div1").mousedown(function(event){ ...

  4. 深入React事件系统(React点击空白部分隐藏弹出层;React阻止事件冒泡失效)

    只关注括号内问题的同学,可直接跳转到蓝字部分.(标题起的有点大,其实只讨论一个问题) 两个在React组件上绑定的事件,产生冲突后,使用e.stopPropagation(),阻止冒泡,即可防止事件冲 ...

  5. React 中阻止事件冒泡的问题

    在正式开始前,先来看看 JS 中事件的触发与事件处理器的执行. JS 中事件的监听与处理 事件捕获与冒泡 DOM 事件会先后经历 捕获 与 冒泡 两个阶段.捕获即事件沿着 DOM 树由上往下传递,到达 ...

  6. 阻止事件冒泡两种方式:event.stopPropagation();和return false;

    jQuery提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation(); $("#div1").mousedown(function (event) { ...

  7. JQuery中阻止事件冒泡方式及其区别

    JQuery 提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation();         $("#div1").mousedown(function( ...

  8. JQuery 提供了两种方式来阻止事件冒泡。

    JQuery 提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation(); $("#div1").mousedown(function(event){ ...

  9. JS如果阻止事件冒泡和浏览器默认事件

    原地址:http://missra.com/article/web-57.html 嵌套的标签元素,如果父元素和子元素都绑定了一些事件,那么在点击最内层子元素时可能会触发父级元素的事件,下面介绍一下J ...

随机推荐

  1. dom操作------获取元素的若干方法

    // 1,getElementById:返回元素节点document.getElementById(); // 2,getElementsByClassName:返回HTMLCollection对象( ...

  2. ABP 数据库 -- ABP&EF中的多表、关联查询

    本文介绍一下ABP中的多表查询. 1.创建实体 多表查询,在ABP或者EF中都很简单,这里我们创建一个Demo,一个学生实体.一个学校实体. 学校里面可以有很多学生,学生有一个学校. 实体如下: 学校 ...

  3. [转]论magento1和magento2的速度性能优化问题

    本文转自:http://www.360magento.com/blog/magento-speed-up/ magento从2007年发展至今,也经历了十余年的磨练,如今也迎来了magento的换代产 ...

  4. echart 数据视图 样式重写

    来源http://blog.csdn.net/u010705091/article/details/75212724 echarts折线图的数据视图样式重写 在echarts.js中,点击折线图的数据 ...

  5. [日常] Go语言圣经--包和文件-包初始化习题

    1.解决包级变量的依赖顺序,然后按照包级变量声明出现的顺序依次初始化 2.包中含有多个.go源文件,它们将按照发给编译器的顺序进行初始化 3.init初始化函数,在每个文件中的init初始化函数,在程 ...

  6. SpringBoot中动态加载(热部署)

    在常规的Java Web开发过程中,在修改完代码后,往往需要重启Tomcat来使得我们的修改生效,在SpringBoot中也需要从新启动SpringBoot来将修改部署.如果我们不希望重启tomcat ...

  7. java锁的简化

    java使用单独的锁对象的代码展示 private Lock bankLock = new ReentrantLock(); //因为sufficientFunds是锁创建的条件所以称其为条件对象也叫 ...

  8. 【JavaFx教程】第六部分:统计图

    第6部分的主题 创建一个统计图显示生日的分布. 生日统计 在AddressApp中所有人员都有生日.当我们人员庆祝他们生日的时候,如果有一些生日的统计不是会更好. 我们使用柱状图,包含每个月的一个条形 ...

  9. Vue: 生命周期, VueRouter

    Vue实例的生命周期: beforeCreate:   实例创建之前除标签外,所有的vue实例需要的数据,事件都不存在 created:  实例被创建之后,data和事件已经被解析到,el还没有找到 ...

  10. 微信小程序 引入公共页面的几种情况

    1.不带参数 首先在pages文件夹中新建一个template文件夹,文件夹中新建一个template.wxml文件,代码如下 <!--template.wxml--> <templ ...