美文网首页React
自定义 hook —— useSize

自定义 hook —— useSize

作者: Lia代码猪崽 | 来源:发表于2021-11-22 18:53 被阅读0次

代码

import { useState, useEffect } from 'react'

export const getTargetElement = (target, defaultElement = window) => {
  if (!target) {
    return defaultElement
  }

  let targetElement;

  if (typeof target === 'function') {
    targetElement = target()
  } else if ('current' in target) {
    if (target.current) {
      targetElement = target.current
    } else {
      return defaultElement
    }
  } else {
    targetElement = target
  }

  return targetElement
}

const useSize = (target) => {
  const [state, setState] = useState({
    width: 0,
    height: 0
  })

  useEffect(() => {
    const targetElement = getTargetElement(target) 
    if (!targetElement) {
      return
    }

    const observer = new ResizeObserver(function elResizeChange(entries) {
      // 每次被观测的元素尺寸发生改变这里都会执行
      entries.forEach((entry) => {
        const { width, height } = entry.target.getBoundingClientRect()
        setState({
          width: width,
          height: height,
        });
      });
    })
    observer.observe(targetElement) // 观测DOM元素

    return () => {
      observer.disconnect()
    }
  }, [target])

  return {
    ...state
  }
}

export default useSize

demo

import React, { useRef } from 'react'
import useSize from './hooks/useSize'

function App() {
  const ref = useRef(null);
  const { width, height } = useSize(ref)

  return (
    <div className="App" style={{textAlign: 'right'}}>
      <div ref={ref} style={{ 
        position: 'absolute',
        width: '33%', 
        height: '66%', 
        background: 'pink' 
      }}>
        123213123
      </div>
      <div>{width}</div>
      <div>{height}</div>
    </div>
  );
}

export default App;
image.png
image.png

相关文章

  • 自定义 hook —— useSize

    代码 demo

  • 在React中创建自定义hook

    什么是自定义hook? 使用自定义hook可以将某些组件逻辑提取到可重用的函数中。 自定义hook是一个从use开...

  • react的一些总结

    什么时候自定义Hook? 当多个组件之间有一些公共的逻辑,可以将他们抽取成自定义的Hook,Hook本质是自定义的...

  • 自定义Hook & 高阶组件

    自定义Hook 自定义Hook: 将一些常用的、跨越多个组件的Hook功能,抽离出去形成一个函数,该函数就是自定义...

  • 自定义hook

    自定义hook 需求描述:自定义一个hook函数,实现获取滚动距离Y const [y] = useWindowS...

  • useSize

    当前窗口,元素的大小变化 缺点 1 .并不能真实的反应div元素的大小,只是height的大小。padding,m...

  • fishHook-代码实例

    可以HOOK系统的C函数,但无法HOOK自定义的函数 fishHook 无法交换自定义函数!!!,这个函数肯定是C...

  • DebugValue Hook

    DebugValue Hook useDebugValue:用于将自定义Hook的关联数据显示到调试栏 如果创建的...

  • [react]24、自定义hooks

    1、自定义Hook的基本使用 自定义Hook本质上只是一种函数代码逻辑的抽取,严格意义上来说,它本身并不算Reac...

  • Hook

    Hook 概念和特点 useState useRef EffectHook 自定义钩子 useCallback u...

网友评论

    本文标题:自定义 hook —— useSize

    本文链接:https://www.haomeiwen.com/subject/fuletrtx.html