在 React 类组件中使用 ResizeObserver

nob*_*are 10 javascript dom resize reactjs

我在 Chrome 上使用 React 15 并希望连接一个事件侦听器来检测对父容器的更改。在四处寻找选项后,我遇到了 ResizeObserver,但不确定如何让它在我的项目中工作。

目前,我将它放在我的构造函数中,但它似乎没有打印任何文本,我不确定在observe调用中放入什么。

class MyComponent extends React.Component {
    constructor(props) {
        super(props);

        const resizeObserver = new ResizeObserver((entries) => {
            console.log("Hello World");
        });

        resizeObserver.observe(somethingGoesHere);
    }

    render() {
        return (
            <AnotherComponent>
                <YetAnotherComponent>
                </YetAnotherComponent>

                <CanYouBelieveIt>
                </CanYouBelieveIt>

                <RealComponent />
            </AnotherComponent>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我也不想RealComponent用 a包装div并给它div一个 id。有没有办法RealComponent直接到?

我的目标是观察任何调整大小的变化,RealComponentMyComponent也很好。我应该在somethingGoesHere插槽中放什么?

编辑:

为了让一些东西工作,我咬紧牙关并div在 周围缠了一个标签RealComponent。然后我给了它一个 id<div id="myDivTag">并更改了observe调用:

resizeObserver.observe(document.getElementById("myDivTag"));
Run Code Online (Sandbox Code Playgroud)

但是,在运行时,我得到:

未捕获的类型错误:resizeObserver.observe 不是函数

任何帮助将不胜感激。

Mar*_*ark 13

编辑:Davidicus 下面的回答更完整,先看那里

ResizeObserver 不能进入构造函数,因为在组件生命周期的那个点上 div 不存在。

我认为您无法绕过额外的 div,因为无论如何反应组件都会减少到 html 元素。

把它放在 componentDidMount 中,它应该可以工作:

componentDidMount() {
   const resizeObserver = new ResizeObserver((entries) => {
        console.log("Hello World");
   });

   resizeObserver.observe(document.getElementById("myDivTag"));
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*cus 7

ComponentDidMount将是设置观察者的最佳位置,但您也想断开ComponentWillUnmount.

class MyComponent extends React.Component {
  resizeObserver = null;
  resizeElement = createRef();

  componentDidMount() {
    this.resizeObserver = new ResizeObserver((entries) => {
      // do things
    });

    this.resizeObserver.observe(this.resizeElement.current);
  }

  componentWillUnmount() {
    if (this.resizeObserver) {
      this.resizeObserver.disconnect();
    }
  }

  render() {
    return (
      <div ref={this.resizeElement}>
        ...
      </div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)


Voč*_*čko 7

我最近正在解决类似的问题,不同之处在于我的应用程序主要使用钩子和功能组件。

以下是如何在 React 功能组件中使用 ResizeObserver 的示例(在打字稿中):

const resizeObserver = React.useRef<ResizeObserver>(new ResizeObserver((entries:ResizeObserverEntry[]) => {
    // your code to handle the size change
}));

const resizedContainerRef = React.useCallback((container: HTMLDivElement) => {
    if (container !== null) {
        resizeObserver.current.observe(container);
    }
    // When element is unmounted, ref callback is called with a null argument
    // => best time to cleanup the observer
    else {
        if (resizeObserver.current)
            resizeObserver.current.disconnect();
    }
}, [resizeObserver.current]);

return <div ref={resizedContainerRef}>
    // Your component content here
</div>;
Run Code Online (Sandbox Code Playgroud)