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将在组件销毁前执行,这样我们可以用于销毁监听器,避免内存泄漏。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值