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

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

自定义 Hook

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

javascript 复制代码
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 来观察元素的大小变化:

javascript 复制代码
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. 显示元素的大小:在组件中显示元素的宽度和高度。
相关推荐
小p1 分钟前
nextjs学习9: Next.js 渲染与缓存
前端·后端
乘风gg1 分钟前
AI 时代,你的编程能力在第几层?我敢说,大多数人卡在第一层
前端·ai编程·claude
wear工程师2 分钟前
React 的 key 为什么不能随手用 index:一插入列表,状态就串了
javascript·react.js
东风破_2 分钟前
React Router v7 实战:用路由配置、懒加载与嵌套路由搭建一个完整的 SPA
前端
引山洪083 分钟前
Babylon.js 8.x 中文文档整理——Node篇 (上)
前端·webgl
嘟嘟07175 分钟前
一文讲通 SPA 前端路由:从传统多页到手写 HashRouter
javascript
柒和远方5 分钟前
V058:前端路由的第一性原理:从 hashchange 手写路由,到 React Router 的嵌套与懒加载
前端·javascript·react.js
计算机魔术师6 分钟前
阿里云上线 One Key MCP 服务:兼容 Qoder、Codex 等,可一键调用多家 MCP 服务
前端
Darling噜啦啦7 分钟前
React Router 全家桶实战:从路由懒加载到嵌套路由的 6 大核心玩法
前端·react.js
冷咖啡离 我的笨笨8 分钟前
通过(Node Js||.Net)基于HTML5的WebSocket实现实时视频文字传输(上)
javascript·.net·html5