react 监听页面是否产生滚动条 hook

这次的需求依然是UI提出的 要求页面右侧不管含不含滚动条 间距都为16 一时间没有什么好的思路
只能用想到啥用啥了
以下为hook主体部分
刚开始用的resize 大部分页面是可以用的 但是有部分页面是可以手动添加数据的 页面自己数据变多了 产生了滚动条 但是并不会触发resize 只能撤掉resize 使用MutationObserver 目前看 算是完美解决问题

import { RefObject, useEffect, useState } from 'react';

function useScrollDetector(containerRef: RefObject<HTMLDivElement>): boolean {
  const [hasVerticalScroll, setHasVerticalScroll] = useState(false);

  useEffect(() => {
    const checkScroll = () => {
      if (containerRef.current) {
        const scrollContainer = containerRef.current;
        setHasVerticalScroll(
          scrollContainer.scrollHeight > scrollContainer.clientHeight,
        );
      }
    };

    checkScroll();

    // 使用 MutationObserver 监听容器内部的变化
    const observer = new MutationObserver((mutations) => {
      mutations.forEach((mutation) => {
        if (mutation.type === 'childList') {
          checkScroll();
        }
      });
    });
    // 由resize监听改为 MutationObserver 监听节点变化 用于检测页面手动操作后导致的页面出现滚动条
    if (containerRef.current) {
      observer.observe(containerRef.current, { childList: true, subtree: true });
    }

    return () => {
      if (containerRef.current) {
        observer.disconnect();
      }
    };

    // window.addEventListener('resize', checkScroll);

    // return () => {
    //   window.removeEventListener('resize', checkScroll);
    // };
  }, [containerRef]);

  return hasVerticalScroll;
}

export default useScrollDetector;

页面调用: 在顶层页面调用 实现全局

import { useScrollDetector } from '@/hooks'
const PageContainer = (props: PageContainerProps) => {
  const pageContainerRef = useRef<HTMLDivElement>(null);

  const hasScroll = useScrollDetector(pageContainerRef)

  const { children, header, backTop, ...otherProps } = props;
  return (
    <EnhancePageContainer
      {...otherProps}
      backIcon={<i className="iconfont icon-xiangzuo"></i>}
      header={{
        ...header,
        breadcrumb: {},
      }}
    >
      <div className="page-content scrollbar" ref={pageContainerRef} style={{paddingRight: hasScroll ? '6px' : '16px'}}>
        {children}
      </div>
      {backTop && (
        <BackTop
          visibilityHeight={0}
          target={() => pageContainerRef.current!}
          {...(typeof backTop === 'object' && backTop)}
        />
      )}
    </EnhancePageContainer>
  );
};
export default PageContainer;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容