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元素的尺寸变化。使用这种模式可以减少冗余代码,并提高组件的可维护性。

相关推荐
解道Jdon13 小时前
SpringBoot4与Spring7发布:云原生深度进化
javascript·reactjs
慢半拍iii13 小时前
JAVA Web —— A / 网页开发基础
前端
gnip14 小时前
pnpm 的 monorepo架构多包管理
前端·javascript
zolty14 小时前
基于hiprint的票据定位打印系统开发实践
javascript
新手村领路人15 小时前
Firefox自定义备忘
前端·firefox
乖女子@@@15 小时前
css3新增-网格Grid布局
前端·css·css3
百思可瑞教育15 小时前
使用UniApp实现一个AI对话页面
javascript·vue.js·人工智能·uni-app·xcode·北京百思可瑞教育·百思可瑞教育
伐尘16 小时前
【CE】图形化CE游戏教程通关手册
前端·chrome·游戏·逆向
不想吃饭e16 小时前
在uniapp/vue项目中全局挂载component
前端·vue.js·uni-app
非凡ghost16 小时前
AOMEI Partition Assistant磁盘分区工具:磁盘管理的得力助手
linux·运维·前端·数据库·学习·生活·软件需求