当前位置: 首页 > article >正文

react中使用ResizeObserver来观察元素的size变化

在 React 中使用 ResizeObserver 来观察元素的大小变化,可以通过创建一个自定义 Hook 来封装 ResizeObserver 的逻辑,并在组件中使用这个 Hook。以下是一个完整的示例,展示了如何在 React 中使用 ResizeObserver 来观察元素的大小变化。

自定义 Hook

首先,创建一个自定义 Hook 来封装 ResizeObserver 的逻辑:

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

const useResizeObserver = () => {
  const [size, setSize] = useState({ width: 0, height: 0 });
  const elementRef = useRef(null);

  useEffect(() => {
    const resizeObserver = new ResizeObserver(entries => {
      for (let entry of entries) {
        setSize({
          width: entry.contentRect.width,
          height: entry.contentRect.height
        });
      }
    });

    if (elementRef.current) {
      resizeObserver.observe(elementRef.current);
    }

    return () => {
      if (elementRef.current) {
        resizeObserver.unobserve(elementRef.current);
      }
      resizeObserver.disconnect();
    };
  }, []);

  return [elementRef, size];
};

export default useResizeObserver;

解释

  1. useResizeObserver Hook:创建一个自定义 Hook,返回一个 ref 和元素的大小。
  2. useState:用于存储元素的大小。
  3. useRef:用于引用要观察的元素。
  4. useEffect:在组件挂载时创建 ResizeObserver 实例,并在组件卸载时清理观察器。
  5. resizeObserver.observe:开始观察元素的大小变化。
  6. resizeObserver.unobserve 和 resizeObserver.disconnect:停止观察元素的大小变化并断开观察器。

使用自定义 Hook

在组件中使用这个自定义 Hook 来观察元素的大小变化:

import React from 'react';
import useResizeObserver from './useResizeObserver';

const MyComponent = () => {
  const [elementRef, size] = useResizeObserver();

  return (
    <div>
      <div ref={elementRef} style={{ width: '50%', height: '200px', backgroundColor: 'lightblue' }}>
        Resize me!
      </div>
      <p>Width: {size.width}px</p>
      <p>Height: {size.height}px</p>
    </div>
  );
};

export default MyComponent;

解释

  1. useResizeObserver Hook:在组件中调用自定义 Hook,获取 ref 和元素的大小。
  2. ref 属性:将 ref 赋值给要观察的元素。
  3. 显示元素的大小:在组件中显示元素的宽度和高度。

http://www.kler.cn/a/455286.html

相关文章:

  • 柒拾捌- 如何通过数据影响决策(六)- 放大再放大
  • SpringCloudAlibaba实战入门之路由网关Gateway初体验(十一)
  • medical meadow medical flashcards
  • 《OpenCV计算机视觉》-对图片的各种操作(均值、方框、高斯、中值滤波处理)及形态学处理
  • 深入解析 Pytest 钩子函数及二次开发过程
  • 网络智能服务
  • 在线免费批量生成 Word 文档工具
  • Linux编程(清华大学出版社2019年1月第1版)第7章-进程间通信-课后作业
  • 信息安全管理:信息系统开发与维护安全控制要点与管理策略
  • 链原生 Web3 AI 网络 Chainbase 推出 AVS 主网, 拓展 EigenLayer AVS 场景
  • 【minicom】Linux串口调试工具 - minicom的安装及使用
  • Temporary failure resolving ‘security.ubuntu.com‘
  • flask后端开发(8):Flask连接MySQL数据库+ORM增删改查
  • 【HarmonyOS】鸿蒙arrayBuffer和Uint8Array互相转化
  • python基础项目
  • 5G/4G工业边缘网关 边缘计算 硬核配置强算力
  • 使用three.js 实现vr全景图展示,复制即可用
  • C语言的语法
  • 集成 jacoco 插件,查看单元测试覆盖率
  • 【Agent】AutoGen Studio2.0开源框架-UI层环境安装+详细操作教程(从0到1带跑通智能体AutoGen Studio)
  • httpclient POST 工具方法
  • python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶
  • <代码随想录> 算法训练营-2024.12.27
  • Linux 硬盘扩容 分区 挂载
  • 蓝牙BLE开发——解决iOS设备获取MAC方式
  • FreePBX修改IP地址和端口以及添加SSL证书开启HTTPS访问