首页 > 其他分享 >使用antd Popover乱飘

使用antd Popover乱飘

时间:2023-12-29 09:36:23浏览次数:30  
标签:rafId const checkOffsetTop requestAnimationFrame current 使用 Popover antd

开发时碰到Popover遮挡Modal弹窗,以及当Popover对应元素上方元素改变高度时,Popover位置没有随着元素移动。于是做了如下处理

<Popover
  content={<>11111111</>}
  arrowPointAtCenter
  autoAdjustOverflow
  zIndex={2} // 设置zIndex比Modal低
  open={openPopover}
>
  <Button ref={ref}>
    222222
    <DownOutlined />
  </Button>
</Popover>;


useEffect(() => {
  const ele = document.querySelector(".box") as HTMLElement;
  // .box 这里是代表着Button的父布局
  lastOffsetTop.current = ele.offsetTop;
  // 关键代码,通过 requestAnimationFrame+throttle 重新设置 Popover 隐藏->显示
  const checkOffsetTop = _.throttle(() => {
    const currentTop = ele.offsetTop;
    if (currentTop !== lastOffsetTop.current) {
      lastOffsetTop.current = currentTop;
      setOpenPopover(false);
      setOpenPopover(true);
    }
    rafId.current = requestAnimationFrame(checkOffsetTop);
  }, 200);

  rafId.current = requestAnimationFrame(checkOffsetTop);

  return () => {
    if (rafId.current) {
      cancelAnimationFrame(rafId.current);
    }
  };
}, []);

这里为什么用 requestAnimationFrame 而不用 MutationObserver 。因为出现了一个现象,当我使用 MutationObserver 时,鼠标没有移动,或者说当我改变了上方元素高度后不再操作,checkOffsetTop 函数会暂停。只有当我再次移动鼠标后才会触发。这里可能是原有代码的问题。在此记录下!

标签:rafId,const,checkOffsetTop,requestAnimationFrame,current,使用,Popover,antd
From: https://www.cnblogs.com/beilo/p/17934039.html

相关文章

  • select 函数使用注意事项 时间重置和检测描述符范围
    select函数中的坑(C语言) 最近写了一个测试驱动的poll函数的应用程序,在应用层中调用select进行操作,设置好timeout之后,如果只对select()调用一次,就没有问题。但一旦多次调用后,就变成只有第一次timeout有效,后面的都没有效果了。#include<sys/types.h>#include<sys/stat.h>#......
  • Layui treeTable 使用【数据不显示、子级不显示】
    //返回JSON数据类publicclassLeaveMessageTreeTable{publicLeaveMessageTreeTable(){this.children=newList<LeaveMessageTreeTable>();this.isParent=false;}publicintId{get;set;}publicintUserId{get;s......
  • WPF中bind使用
    1、例TextBox的text关联类的属性1.1、类的创建classTestViewMode:INotifyPropertyChanged{publiceventPropertyChangedEventHandlerPropertyChanged;protectedvoidOnPropertyChanged(stringpropertyName){PropertyC......
  • 使用Numpy实现手写数字识别
    1概要  用Python语言在只使用Numpy库的前提下,完成一个全连接网络的搭建和训练。2实现代码参考:https://github.com/binisnull/ann2.1环境设置  创建Python3.8.16的虚拟环境,激活并执行python-mpipinstallnumpy==1.18.5tensorflow-gpu==2.3.0Pillowmatplot......
  • 自己写的mapper.xml如何使用mybatis-plus的自带分页?
    在MyBatis-Plus中,使用自带的分页功能非常简单。首先,确保你的mapper.xml文件中定义了需要的SQL语句,并在相应的mapper接口中使用IPage类型的参数进行分页。接下来,使用Page类来包装查询条件,并调用Mapper接口的分页方法。首先,假设你的mapper.xml中有类似如下的查询语句:<!--在mapper.xm......
  • Java Spring Boot Mybatis-Plus 的简单使用
    此文主要基于官网case整理,如需了解更多详情,请移步官网。环境:SpringBoot:3.1.6JDK:17MySQL:5.7数据准备主要是MySQL建库建表,插入一些数据。建库:CREATEDATABASEmybatis_demo;建表:DROPTABLEIFEXISTS`user`;CREATETABLE`user`(idBIGINTNOTNULLCOMME......
  • 在Linux平台安装使用Anaconda
    下载在https://repo.anaconda.com/archive/https://repo.anaconda.com/archive/找到一个合适的版本,右键复制链接然后wget它:wgethttps://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-x86_64.sh安装添加执行权限:chmod+xAnaconda3-2023.07-2-Linux-x86_64.sh运......
  • 定时器原理及使用
    一、引入在进行并发编程时,有时候会需要定时功能,比如监控某个GO程是否会运行过长时间、定时打印日志等等。GO标准库中的定时器主要有两种:Timer定时器、Ticker定时器。Timer计时器使用一次后,就失效了,需要Reset()才能再次生效。而Ticker计时器会一直生效。二、Timer定时器1)实现原......
  • Vb.net 使用Webview2显示pdf文件
    使用webview2显示PDF文件需要wvliulanqi--Webview2控件的 AwaitWv2.EnsureCoreWebView2Async函数来启动浏览器否则会报错注意Div的宽度高度PrivateSubButton1_ClickAsync(senderAsObject,eAsEventArgs)HandlesButton1.ClickDimstrPathAs......
  • mrml 使用中的一些问题
    mrml对于mjml的兼容还是很不错的,目前是一些问题问题mjmlversion问题这个属于早期版本的问题了,目前使用方法已经不包含此参数了 <mjmlversion="3.3.3">应该去掉version其他配置参数mrml的实现与mjml的配置参数基本一致,有几个参数我们需要......