React onBlur回调中使用document.activeElement返回body解决方案

这篇具有很好参考价值的文章主要介绍了React onBlur回调中使用document.activeElement返回body解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最开始想实现一个功能,点击img图标后给出购物下拉框CartDropdown,当img及CartDropdown失去焦点时隐藏CartDropdown。

最开始的核心代码如下:

export default function Cart() {
	const [isCartOpen, setIsCartOpen] = useState(false)
	
	function clickHandler() {
		setIsCartOpen(!isCartOpen)
	}

	function closeCartDropdown() {
            if(!document.querySelector('#cart').contains(document.activeElement)) {
                    setIsCartOpen(false)
            }
	}

	return (
		<div id="cart" className="relative" onBlur={closeCartDropdown}>
			<div tabIndex={0} onClick={clickHandler} className='relative hover:-translate-y-0.5 active:translate-y-0 transition-transform cursor-pointer'>
				<img className='h-14' src="/src/assets/images/shopping_bag.png" alt="shopping bag" />
				<span className='Z-10 text-2xl font-bold absolute left-1/2 -translate-x-1/2 -translate-y-2/3' style={{top:'70%'}}>4</span>
			</div>
			{
				<CartDropdown isCartOpen={isCartOpen}/>
			}
		</div>
	)
}

这个版本的代码中在onBlur回调中使用document.activeElement函数想要获取当前聚焦的元素,之后通过判断聚焦的元素是cart组件内的来判断是否需要隐藏cartDropdown,但这里document.activeElement返回的都是body元素。

后面我加入了onFocus函数,并在其中获取document.activeElement却能返回正确的结果,并且是先触发onBlur再触发onFocus函数。这样就可以确定,在之前的元素失去焦点时,onBlur函数被调用,此时没有焦点因此默认给在body上;之后onFocus函数执行,此时新元素获得焦点,因此可以正常获取聚焦结果。

因此在onBlur中想要正确获取聚焦元素,应该在onFocus函数调用后,所以可以使用异步函数来完成这一点。我选取setTimeout来进行异步操作,并且成功在onBlur函数中获取到了正确的document.activeElement值。

function closeCartDropdown() {
	setTimeout(() => {
             if(!document.querySelector('#cart').contains(document.activeElement)) {
		setIsCartOpen(false)
             }
        }, 0)
}

备注:传统html中blur事件是不能冒泡的,但react中进行了特殊的处理成功模拟了冒泡,因此可以实现子组件失去焦点,调用父组件回调函数的效果。文章来源地址https://www.toymoban.com/news/detail-415681.html

到了这里,关于React onBlur回调中使用document.activeElement返回body解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JS键盘事件: onkeyup onkeypress onblur onfocus作用。

    查询快递单号的时候,想要在键盘输入然后在驿站大屏幕上展示出来。应该怎么做到呢? @onkeyup @onkeypress @onblur @onfocus使用这四个事件操作试试咯! 1、按下键盘任意键并松开就可以触发onkeyup事件 2、事件会在键盘按键被按下并释放一个键时发生。  3、  失焦事件(onblur)

    2024年02月12日
    浏览(34)
  • react反向代理:http请求状态返回200,控制台预览和响应没有返回值是怎么回事

     今天调试接口的时候遇到这样的情况:         http请求状态返回200,控制台预览和响应没有返回值。如下图所示: 对照之前的请求地址,发现调试的这个请求地址跟原来的请求地址相比较多了一个前缀,再查看proxy代理文件,发现按照原来的请求地址做了反向代理,将

    2024年02月11日
    浏览(67)
  • React Navigation顶部导航自定义左侧返回按钮图标和文案

     router/config.js:  back/Index.js:     参考链接: https://reactnavigation.org/docs/native-stack-navigator https://chat.xutongbao.top/

    2024年02月13日
    浏览(53)
  • 使用 Postman 传递请求参数:Query、Path 和 Body 教程

    Postman  作为一个功能强大的工具,极大地简化了 API 测试和调试的过程,提供了发送请求和检查响应的直接方法。本文将着重介绍如何在 Postman 中高效地处理请求参数,以提高 API 测试和开发的便利性。 首先,我们需要明白什么是请求参数。简单来说,请求参数是传递给服务

    2024年04月23日
    浏览(40)
  • java 使用documents4j将XML转为pdf文件的方式

    通过spire.doc.free将word转换成PDF时存在缺陷:只能获取前3页。获取全文另外需支付费用。 使用documents4j,documents4j会保留原word文件中更多的样式,如修订模式下的差异化字体颜色、文档右侧修订记录等。 1.引入Pom 2.  xml2pdf方法如下,xmlpath是xml文件地址,pdfPath是生成的pdf地址

    2024年02月21日
    浏览(50)
  • axios同时使用查询参数(query)和请求体参数(body)发送请求

    当使用 axios.post 方法发送请求时,可以同时添加查询参数(query)和请求体参数(body)。具体的方法是将查询参数添加到URL中,并将请求体参数作为 data 属性传递给 axios.post 方法。 代码演示: 下面是一个示例,演示了如何将查询参数和请求体参数同时传递给 axios.post 方法:

    2024年03月11日
    浏览(56)
  • Java使用Documents4j实现Word转PDF(知识点+案例)

    博主介绍:✌目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。 博主所有博客文件目录索引:博客目录索引(持续更新) 视频平台:

    2024年02月20日
    浏览(45)
  • 提升 Postman 使用技巧:完全掌握 Query、Path 和 Body 参数传递

    题解 | #密码验证合格程序# #include iostream#include vectorus   题解 | #数字颠倒# import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 pa   淘天一面 面经 淘天一面:计算机开机的过程经历了什么?站在计算机这个视角,为什么要有操作系统?操作系统的虚拟化技术(   美团前端

    2024年04月13日
    浏览(53)
  • vue使用axios发送post请求携带json body参数,后端使用@RequestBody进行接收

    最近在做自己项目中,做一个非常简单的新增用户场景,但是使用原生axios发送post请求的时候,还是踩了不少坑的。 唉,说多了都是泪,小小一个新增业务,在自己前后端一起开发的时候,硬是搞了好久。 下面就把问题总结分享下,防止后人再踩坑。 首先先看下我的接口定

    2024年02月02日
    浏览(55)
  • react18中antd的Upload组件上传头像,并且拿到服务器返回的头像的url地址在页面中显示头像

    业务需求:上传头像,上传完毕后拿到头像的url,把头像展示在页面中,最终把头像url和其他用户信息一起发送给服务器   上传头像流程   导入 Upload 组件和图标(一个加号,一个加载中)   定义状态   定义一个上传状态组件,上传前显示 + 号,上传时显示loading   组件代码(

    2023年04月22日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包