React中实现类似v-click-outside效果
React中实现类似v-click-outside效果
问题背景
- 有时候我们需要点击某个下拉框等元素、组件的外部关闭下拉框。
解决方法
使用window.addEventListener监听整个页面
const [elVisible,setElVisible] = useState(false) const handle = (event) => {if(!el.current?.contains(event.target) && elVisible){setElVisible(false)} }; window.addEventListener('click',handle)
在上面的handle函数中,我们判断了点击事件的原始目标是否是el元素或el元素的子元素。
使用useEffect模拟componentDidMounted和componentBeforeUnmount
useEffect(() => {const [elVisible,setElVisible] = useState(false)const handle = (event) => {if(!el.current?.contains(event.target) && elVisible){setElVisible(false)}};window.addEventListener('click',handle)return () => window.removeListener('click',handle) })
借助useEffect的副作用函数将在组件挂载之后执行的性质模拟componentDidMounted,并且副作用函数的return将在组件销毁前执行,这样我们可以用于销毁监听器,避免内存泄漏。
React中实现类似v-click-outside效果相关推荐
- react中实现取色器的效果React Color
前言: react中实现取色器的效果 官网地址:入口 源码:https://github.com/casesandberg/react-color.git 实现效果: 步骤: 第一:引入 npm in ...
- 【SwiftUI模块】0018、SwiftUI搭建一个类似支付宝中的余额宝余额数字动画效果
SwiftUI模块系列 - 已更新18篇 SwiftUI项目 - 已更新1个项目 往期Demo源码下载 技术:SwiftUI.SwiftUI3.0.支付宝.余额宝.数字动画 运行环境: SwiftUI ...
- 【VUE】有没有类似React中<>空标签的东西呢?
问:Vue中有没有类似React中<>空标签的东西呢? 答:有 不废话直接上方案: 方案一 vue2/3应该是通用的方式,vue3上可行 若上级使用到<Transition>会 ...
- React中Fragment标签和空标签的使用(vue中的template标签类似)
Fragment作用: 类似于vue中的template标签,将当前dom不渲染后页面.在多层循环中可以添加key属性,其他属性不可以添加.不然会警告,提示只能有key属性和children vdom ...
- React中实现插槽效果的方案
文章目录 React实现插槽 children实现插槽 props实现插槽 React实现插槽 在开发中,我们抽取了一个组件,但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的di ...
- react中使用构建缓存_使用React构建Tesla的电池范围计算器(第1部分)
react中使用构建缓存 by Matthew Choi 由Matthew Choi 使用React构建Tesla的电池范围计算器(第1部分) (Building Tesla's Battery Ra ...
- 处理 react_【学习教程】React 中阻止事件冒泡的问题
来源 | https://www.cnblogs.com/Wayou/p/react_event_issue.html 在正式开始前,先来看看 js 中事件的触发与事件处理器的执行. js 中事件的监 ...
- 如何在React中做到jQuery-free
前言 前些天在订阅的公众号中看到了以前阮一峰老师写过的一篇文章,「如何做到 jQuery-free?」.这篇文章讨论的问题,在今天来看仍不过时,其中的一些点的讨论主要是面向新内核现代浏览器的标准 DO ...
- React中的合成事件
React中的合成事件 React自己实现了一套高效的事件注册.存储.分发和重用逻辑,在DOM事件体系基础上做了很大改进,减少了内存消耗,简化了事件逻辑,并最大程度地解决了IE等浏览器的不兼容问题. ...
最新文章
- PDO的bindParam与bindValue的区别
- HDU_oj_2050 折线分割平面
- python入门之玩转列表我的菜单_我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)...
- matlab读取data格式,ReadData3D 各种格式图像的读取,包括医学 效果很好 matlab 272万源代码下载- www.pudn.com...
- Python中使用中文
- php+mysql个人博客系统_推荐几个开源的个人独立博客系统
- 电脑系统哪个最好用_小米MIUI领衔,目前最好用的几个安卓系统,你觉得哪个更好用?...
- 决策过程并举例_成本效益分析举例
- python中判断文本的编码格式
- win98/win95
- python新手入门.pdf_所有Python入门书籍的整理,初学者必看,附赠所有电子版(一)...
- DevComponents.DotNetBar2 美化包使用以及验证教程
- 业务与信令-第6章VoLTE信令
- 数学常用特殊符号读音
- 图形桌面与命令行模式相关切换快捷键
- python_计算股票指标
- 购物系统 java代码_java购物系统源代码
- win7系统桌面的东西不见了,提示您已使用临时配置文件登录
- 报表和专业BI有什么区别?
- CentOS7.x配置三线策略路由
热门文章
- QT各种压缩包下载地址
- 计算机无法ghost安装系统安装系统安装,详细教您重装Ghost系统错误怎么办
- HDU 5238 线段树+数论
- 便签工具类产品推荐,办公便签软件哪个好
- 如何将二维码巧妙放进海报里?
- 获取HTML页面的所有图片地址
- esp32 micropython 控制ws2812 RGB灯带
- OKHTTP之缓存配置详解
- 接口自动化之操作mysql数据库
- 错误	3	error C2181: 没有匹配 if 的非法 else	c:\users\zhong\desktop\我的程序\c++qt程序\test\sineware\sineware\sinewa