React中阻止冒泡


title: React中阻止冒泡
date: 2022-08-26 22:28:17
tags:

  • React
  • 框架
  • 阻止冒泡行为
    categories:
  • 框架
  • React

React中阻止冒泡

原因:在制作一个关于日历组件的时候,遇到一个bug😥,点击input框让日历显示,点击日历以外的区域日历框隐藏。但是无效!且有闪烁bug!

原本的思路是利用获取焦点失去焦点实现,点击input获取焦点显示日历框,失去焦点后再隐藏日历框。

但是! 日历框中有切换月份的按钮,当点击按钮时会失去焦点,又再次触发失去焦点的事件,有闪烁bug。如图:

image-20220826223515130

所以我就给div添加了tabIndex="-1"使div也可以添加获取焦点失去焦点方法。为最外层的div添加click事件获取焦点显示日历盒子,但是当点击日历盒子内部的标签后会依次触发失去焦点,获取焦点事件,形成闪烁(我的显示与隐藏是提前写好的动画类名);

以上就是我最初尝试的方法一,无效。后来想到可以利用点击html触发隐藏日历盒子的方法

为document添加点击事件,

    useEffect(()=>{
        // 点击除去日历以外的部分隐藏日历
        document.onclick = ()=>{
            setShow(false) // 隐藏日历盒子
        }
    },[])//仅仅在第一次return后触发

但是,如果不在点击div显示日历盒子的方法内添加阻止冒泡,当点击日历盒子内的任何地方,都会冒泡到document上触发隐藏盒子的方法;所以就要利用阻止冒泡!

    // div获取焦点
    function divFocus(e) {
        e.nativeEvent.stopImmediatePropagation();
        setFocus(true) // 设置触发div后的样式为开启
        setShow(true) // 设置日历盒子显示
    }

此时,点击日历盒子以外的地方就会将日历盒子隐藏!😋

参考帖子(力推)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值