点击空白处隐藏弹出层的原理是:在 document 上绑定事件来隐藏弹出层,这样点击任何元素的时候都会冒泡到 document 上,都会执行隐藏弹出层的功能。然后我们在不需要隐藏弹出层的元素上阻止冒泡即可。

class Select extends Component {
constructor(props) {
super(props); this.state = {
selected: props.list[0],
showList: false
}; this.showList = this.showList.bind(this);
} componentDidMount() {
// 在 document 上绑定点击事件,隐藏弹出层
document.addEventListener('click', (e) => {
this.setState({
showList: false
});
});
} showList(e) {
// 使用 react 的 e.stopPropagation 不能阻止冒泡,需要使用 e.nativeEvent.stopImmediatePropagation,这里我们对其进行封装,方便多次调用
this.stopPropagation(e);
this.setState({
showList: !this.state.showList
});
} selectList(i) {
const selected = this.props.list[i];
this.setState({
selected: selected,
showList: false
});
this.props.onChange(selected);
} // 封装后的阻止冒泡功能
stopPropagation(e) {
e.nativeEvent.stopImmediatePropagation();
} render() {
const { list } = this.props;
const { selected, showList } = this.state;
return (
<div className="hp-select">
<span className="hp-select__text">{selected.text}</span>
<span className="hp-select__btn" onClick={this.showList}></span>
<div
className="hp-select__list"
style={{ display: showList ? 'block' : 'none' }}
// 方便的调用封装冒泡功能来阻止冒泡
onClick={this.stopPropagation}
>
<ul>
{
list && list.map((item, i) => {
return <li key={item.value} onClick={this.selectList.bind(this, i)}>{item.text}</li>;
})
}
</ul>
</div>
</div>
);
}
}

react 点击空白处隐藏弹出层的更多相关文章

  1. js的事件冒泡和点击其他区域隐藏弹出层

    一.前言 在编写页面的时候,我们经常使用到弹出层.对于弹出层,原本的意义就是增加与用户的交互,提升用户的好感度.如果弹出层都没有较好的体验,那何谈通过交互来提升好感... 首先提出几个弹出层的注意点: ...

  2. Jquery 点击图片在弹出层显示大图

    http://blog.csdn.net/wongwaidah/article/details/28432427(案例链接出处,本人只是转载收藏) <html> <head> ...

  3. vue中点击空白处隐藏弹框(用指令优雅地实现)

    在写vue的项目的时候,弹框经常性出现,并要求点击弹框外面,关闭弹框,那么如何实现呢?且听我一一...不了,能实现效果就好 <template> <div> <div c ...

  4. layui如何隐藏弹出层关闭的按钮

    layui默认弹出层是带有关闭按钮的,但是在某些场景我们不需要layui的关闭按钮,这时只需添加closeBtn :0即可 效果图如下: 示例代码如下: layui.use('layer', func ...

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

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

  6. js 点击 隐藏弹出层

    document.onmousedown = function(e){ var ev = document.all ? window.event : e; var _con = $("#ci ...

  7. [转]Jquery 点击图片在弹出层显示大图

    这个还行不需要别的包! https://www.cnblogs.com/antis/p/7053991.html

  8. Layer 弹出页面 在点击保存关闭弹出层

    <script src="http://apps.bdimg.com/libs/jquery/2.0.0/jquery.min.js"></script> ...

  9. 利用React/anu编写一个弹出层

    本文将一步步介绍如何使用React或anu创建 一个弹出层. React时代,代码都是要经过编译的,我们很多时间都耗在babel与webpack上.因此本文也介绍如何玩webpack与babel. 我 ...

随机推荐

  1. 数组中的stdClass Object如何访问

    使用print_r($data)输出结果为 Array ( [0] => stdClass Object ( [color_item_no] => 1 [color_name] => ...

  2. 全面解读第四代基因测序技术Oxford Nanopore--转载

    纳米孔测序技术(又称第四代测序技术)是最近几年兴起的新一代测序技术.目前测序长度可以达到150kb.这项技术开始于90年代,经历了三个主要的技术革新:一.单分子DNA从纳米孔通过:二.纳米孔上的酶对于 ...

  3. Django的STATIC_ROOT和STATIC_URL以及STATICFILES_DIRS

    首先,我们配置静态文件,要在setting.py里面加入如下几行代码: settings.py # the settings above# STATIC SETTINGSSTATIC_URL = '/ ...

  4. mongodump and mongorestore

    mongoexport和mongoimport只能导出/导入某个特定集合 1 mongoexport bin目录下 ./mongoexport <hostname><:port> ...

  5. 『TensorFlow』读书笔记_SoftMax分类器

    开坑之前 今年3.4月份的时候就买了这本书,同时还买了另外一本更为浅显的书,当时读不懂这本,所以一度以为这本书很一般,前些日子看见知乎有人推荐它,也就拿出来翻翻看,发现写的的确蛮好,只是稍微深一点,当 ...

  6. 万年不变话题cookie,简单总结

    cookie是面试中经常会问到的一个问题,但是就我的项目实践来看,我用到的次数极少.有时候用到也不是为了存储用户名密码,只是存储一些需要记住的状态.可能和我的经验尚浅,涉足的项目不算多有关.这里简单做 ...

  7. 选择器:first-child与:last-child失效的解决方法

    作为还在努力练习的代码小白来说,有时类名或者ID名太多很容易就会搞混,为此,在练习中会想着借用多样的选择器来设置而不是每一个标签都设一个类名(Id名),在此次练习中使用选择器:first-child与 ...

  8. 解决table宽度设置不起作用,由于内容问题被撑开 亲测 完美解决

    1.在table 标签添加样式 table-layout: fixed; 必须设置width的值:<table style="table-layout: fixed"> ...

  9. 学习笔记-AngularJs(八)

    在使用form.FormController和ngModel.NgModelController之前,先来学习一下怎么一个ng-model-options指令,觉得怎么这个指令挺好用的,我们知道ng- ...

  10. Python第一个GUI

    #!/usr/bin/python#coding=utf-8'''Created on 2017年11月2日 from home @author: James zhan ''' from functo ...