react window resize

2020-11-23  本文已影响0人  想溜了的蜗牛

目的 响应式处理 fixed 定位的二级 tabbar 的宽度

下面这段代码是一开始的做法,只能在初始化时更新一下宽度,用户屏幕宽度如果有变化时不能自动调整。

  const ref = React.useRef(null);
  React.useEffect(() => {
    const parentWidth = ref.current ? ref.current.parentNode.offsetWidth : 0
    ref.current.style.width = `${parentWidth}px`
  }, [ref.current]);

  return (
    <>
      <Toolbar ref={ref}>
        .....
     </Toolbar>
    </>
  );

最终是参考了 React Hooks — useObserve (use ResizeObserver Custom Hook) 这篇文章,这篇文章基本上是一步步,手把手教实现自定义 resize 的 hook 组件。因为是medium上的,访问要上墙,直接将最后代码贴出来

import {useEffect, useRef} from 'react';
import PropTypes from 'prop-types';
import ResizeObserver from "resize-observer-polyfill";

const useObserver = ({ callback, element }) => {

  const current = element && element.current;

  const observer = useRef(null);

  useEffect(() => {
      // if we are already observing old element
      if (observer && observer.current && current) {
        observer.current.unobserve(current);
      }
      const resizeObserverOrPolyfill =  ResizeObserver;
      observer.current = new resizeObserverOrPolyfill(callback);
      observe();

      return () => {
        if (observer && observer.current && element &&
           element.current) {
          observer.current.unobserve(element.current);
        }
      };
  }, [current]);

  const observe = () => {
    if (element && element.current && observer.current) {
      observer.current.observe(element.current);
    }
  };

};

useObserver.propTypes = {
  element: PropTypes.object,
  callback: PropTypes.func,
};

export default useObserver;

使用:

import useObserver from './ResizeObserver';
...

const layoutA = {
  const measuredRef = React.useRef(null);
  useObserver({
    element: measuredRef,
    callback: element=>{
      let target = element[0].target
      target.firstChild.style.width = `${target.offsetWidth}px`;  // 将当前节点的宽度设置给子节点
    }
  })

  return (
    <>
      <Grid ref={measuredRef} >
        <tabbar> ... </tabbar>
        ....
      </Grid>
    <>
  )
}

参考文章如下:
我该如何测量 DOM 节点?
React Hooks — useObserve (use ResizeObserver Custom Hook)

上一篇 下一篇

猜你喜欢

热点阅读