在 React 类组件中使用 ResizeObserver

新手上路,请多包涵

我在 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>
        );
    }
}

理想情况下,我也不想将 RealComponent 包装在 div 中并给 div 一个 id。有没有办法直接到 RealComponent

我的目标是观察对 RealComponent 的任何调整大小更改,但是 MyComponent 也很好。我应该在 somethingGoesHere 槽中放什么?

编辑:

为了得到一些东西的工作,我咬紧牙关并包裹了一个 div 标记 RealComponent 。然后我给了它一个 id <div id="myDivTag"> 并更改了 observe 调用:

 resizeObserver.observe(document.getElementById("myDivTag"));

但是,当运行它时,我得到:

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

任何帮助将不胜感激。

原文由 noblerare 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 693
2 个回答

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

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

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

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

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

   resizeObserver.observe(document.getElementById("myDivTag"));
}

原文由 Mark 发布,翻译遵循 CC BY-SA 4.0 许可协议

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>
    );
  }
}

原文由 Davidicus 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏