React中阻止冒泡
原因:在制作一个关于日历组件的时候,遇到一个bug😥,点击input框让日历显示,点击日历以外的区域日历框隐藏。但是无效!且有闪烁bug!
原本的思路是利用获取焦点失去焦点实现,点击input获取焦点显示日历框,失去焦点后再隐藏日历框。
但是! 日历框中有切换月份的按钮,当点击按钮时会失去焦点,又再次触发失去焦点的事件,有闪烁bug。如图:
所以我就给div添加了tabIndex="-1"
使div也可以添加获取焦点失去焦点方法。为最外层的div添加click事件获取焦点显示日历盒子,但是当点击日历盒子内部的标签后会依次触发失去焦点,获取焦点事件,形成闪烁(我的显示与隐藏是提前写好的动画类名);
以上就是我最初尝试的方法一,无效。后来想到可以利用点击html触发隐藏日历盒子的方法
为document添加点击事件,
1 | useEffect(()=>{ |
但是,如果不在点击div显示日历盒子的方法内添加阻止冒泡,当点击日历盒子内的任何地方,都会冒泡到document上触发隐藏盒子的方法;所以就要利用阻止冒泡!
1 | // div获取焦点 |
此时,点击日历盒子以外的地方就会将日历盒子隐藏!😋