React -- useSize Hook 封装

React -- useSize Hook 封装

在开发React应用时,经常需要响应元素尺寸的变化,以提供更好的用户体验。本文将介绍如何封装一个自定义的useSize Hook,它可以监听某个元素的大小变化并返回其宽高。

背景知识

在React中,自定义Hook是一种重用状态逻辑的机制。useSize Hook将返回所观察元素的宽度和高度。

使用useState和useLayoutEffect

引入useStateuseLayoutEffect钩子。useState用来存储元素的宽度和高度,而useLayoutEffect用来订阅尺寸变化。

响应尺寸变化

通过ResizeObserver API,可以监听元素尺寸的变化。当被监听元素尺寸发生变化时,ResizeObserver将执行一个回调函数,在这个回调函数中,用setState更新元素的尺寸信息。

清理工作

为了避免内存泄漏,需要在useLayoutEffect的清理函数中断开ResizeObserver的监听。

完整的 Hook 实现

下面是useSize Hook 的完整代码实现:

jsx 复制代码
import { useState, useLayoutEffect } from 'react';
import ResizeObserver from 'resize-observer-polyfill';

function useSize(target) {
  const [state, setState] = useState(() => {
    return {
      width: target ? target.clientWidth : 0,
      height: target ? target.clientHeight : 0,
    };
  });

  useLayoutEffect(() => {
    if (!target) {
      return () => {};
    }

    const resizeObserver = new ResizeObserver(entries => {
      entries.forEach(entry => {
        setState({
          width: entry.target.clientWidth,
          height: entry.target.clientHeight,
        });
      });
    });

    resizeObserver.observe(target);

    return () => {
      resizeObserver.disconnect();
    };
  }, [typeof target === 'function' ? undefined : target]);

  return state;
}

export default useSize;

这个Hook将返回一个包含widthheight属性的对象,且会在被观察元素的尺寸变化时更新这两个属性。结合实际情况,你可以很容易地将这个Hook集成到你的React组件中。

使用方式

你可以在组件中调用useSize,并传递一个DOM元素引用(ref)作为参数。这个Hook将返回该元素的宽度和高度。

jsx 复制代码
  const chartRef = useRef(null);
  const size = useSize(chartRef.current);

小结

useSize Hook 提供了一种简洁而又高效的方式来监听和响应React元素的尺寸变化。使用这种模式可以减少冗余代码,并提高组件的可维护性。

相关推荐
工程师老罗18 分钟前
Image(图像)的用法
java·前端·javascript
早點睡39026 分钟前
ReactNative项目OpenHarmony三方库集成实战:react-native-swiper
javascript·react native·react.js
jump_jump1 小时前
深入 JavaScript Iterator Helpers:从 API 到引擎实现
javascript·性能优化
swipe1 小时前
把 JavaScript 原型讲透:从 `[[Prototype]]`、`prototype` 到 `constructor` 的完整心智模型
前端·javascript·面试
问道飞鱼1 小时前
【前端知识】React 组件生命周期:从底层原理到实践场景
前端·react.js·前端框架·生命周期
Dxy12393102162 小时前
JS发送请求的方法详解
开发语言·javascript·ecmascript
CHU7290352 小时前
定制专属美丽时刻:美容预约商城小程序的贴心设计
前端·小程序
浩~~2 小时前
反射型XSS注入
前端·xss
AwesomeDevin2 小时前
AI时代,我们的任务不应沉溺于与 AI 聊天,🤔 从“对话式编程”迈向“数字软件工厂”
前端·后端·架构
harrain3 小时前
antvG2折线图和区间range标记同时绘制
前端·javascript·vue.js·antv·g2