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

  1. class Select extends Component {
  2. constructor(props) {
  3. super(props);
  4.  
  5. this.state = {
  6. selected: props.list[0],
  7. showList: false
  8. };
  9.  
  10. this.showList = this.showList.bind(this);
  11. }
  12.  
  13. componentDidMount() {
  14. // 在 document 上绑定点击事件,隐藏弹出层
  15. document.addEventListener('click', (e) => {
  16. this.setState({
  17. showList: false
  18. });
  19. });
  20. }
  21.  
  22. showList(e) {
  23. // 使用 react 的 e.stopPropagation 不能阻止冒泡,需要使用 e.nativeEvent.stopImmediatePropagation,这里我们对其进行封装,方便多次调用
  24. this.stopPropagation(e);
  25. this.setState({
  26. showList: !this.state.showList
  27. });
  28. }
  29.  
  30. selectList(i) {
  31. const selected = this.props.list[i];
  32. this.setState({
  33. selected: selected,
  34. showList: false
  35. });
  36. this.props.onChange(selected);
  37. }
  38.  
  39. // 封装后的阻止冒泡功能
  40. stopPropagation(e) {
  41. e.nativeEvent.stopImmediatePropagation();
  42. }
  43.  
  44. render() {
  45. const { list } = this.props;
  46. const { selected, showList } = this.state;
  47. return (
  48. <div className="hp-select">
  49. <span className="hp-select__text">{selected.text}</span>
  50. <span className="hp-select__btn" onClick={this.showList}></span>
  51. <div
  52. className="hp-select__list"
  53. style={{ display: showList ? 'block' : 'none' }}
  54. // 方便的调用封装冒泡功能来阻止冒泡
  55. onClick={this.stopPropagation}
  56. >
  57. <ul>
  58. {
  59. list && list.map((item, i) => {
  60. return <li key={item.value} onClick={this.selectList.bind(this, i)}>{item.text}</li>;
  61. })
  62. }
  63. </ul>
  64. </div>
  65. </div>
  66. );
  67. }
  68. }

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. Nginx教程---03.Nginx日志切割

    Nginx的定时任务与自动切割 明确: 如果这个网站的访问量比较大,那么一天下来 nginx日志可能会特别的大,所以当出现这种情况呢,如果 把每天的日志都存在同一个日志文件里,会使你的日志文件大到让你 ...

  2. Java对象的访问方式

    之前写过一篇随笔 https://www.cnblogs.com/qianjinyan/p/10352749.html 现在看看,貌似不是很准确,方法区和栈应当区分开来,两者有很大的区别 看下面的一个 ...

  3. 【Core】.NET Core中读取App.config配置文件

    1.项目中添加App.config文件 因为.NET Core的项目本质是控制台应用,所以ConfigurationManager的API会去默认读取app.config配置文件,而不是web.con ...

  4. numpy最大值和最大值索引

    a= np.array([9, 12, 88, 14, 25])list_a = a.tolist() list_a_max_list = max(list_a) #返回最大值max_index = ...

  5. pycharm鸡火

    由于github被封杀,大虾把它挪到了gitee下面 /pengzhile/jetbrains-agent 主要是一个jar包,放在D:\Program Files\JetBrains\PyCharm ...

  6. Jellyfish详解

    一.Jellyfish简介 JELLYFISH是CBCB(Center for Bioinformatics and Computational Biology)的Guillaume Marçais ...

  7. LeetCode--017--电话号码的字母组合(java)

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...

  8. 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支

    下图Github地址:Mask_RCNN       Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...

  9. babel-plugin-import配置babel按需引入antd模块,编译后报错.bezierEasingMixin()

    用create-react-app做项目的时候,同时引入了antd,为了实现按需加载antd模块,用到他们提供的  babel-plugin-import  ( 一个用于按需加载组件代码和样式的 ba ...

  10. 最近使用Navicat for MySQl访问远程mysql数据库,出现报错,显示“2003- Can't connect MySQL Server on 'localhost'(10038)“。

    优先考虑mysql数据库是否开启 1.先看报错窗口.   通过百度,最终找到的原因是:远程3306端口未对外开放. 于是下面进行远程3306端口开放操作.   首先远程连接服务器,点击“开始”-“管理 ...