React如何在HOC中获取包装组件的高度?

时间:2018-12-22 08:24:07

标签: html reactjs dom react-ref

有什么方法可以获取包装组件的DOM高度吗?

我尝试添加引用,但控制台错误Function components cannot be given refs.

我设置了forward ref,但事实并非如此。

export default function withInfiniteScroll(Component) {  
  return class extends React.Component {
    componentDidMount() {
      window.addEventListener('scroll', this.onScroll, true);
    }
    onScroll = () => {
      // here
      console.log(
        'window.innerHeight', window.innerHeight,
        '\ndocument.body.offsetHeight', document.body.offsetHeight,
      );
    }
    render() {
      return <Component {...this.props} />;
    }
  };
}

我想记录Component的高度,但是这些记录没有意义,它们是html-body的高度,而不是Component的高度。

window.innerHeight 767 
document.body.offsetHeight 767 

但是当我在Chrome控制台中时:

console.log(document.getElementsByClassName('home-container')[0].clientHeight)
> 1484

'home-container'是一个包装的组件:

withInfiniteScroll(HomeContainer);

1 个答案:

答案 0 :(得分:1)

包装的组件应使用forwardRef公开对底层DOM元素的引用:

function withInfiniteScroll(Component) {  
  return class extends React.Component {
    ref = React.createRef();

    componentDidMount() {
      window.addEventListener('scroll', this.onScroll, true);
    }

    onScroll = () => {
      console.log(this.ref.current.clientHeight);
    }

    render() {
      return <Component ref={this.ref} {...this.props} />;
    }
  };
}

const Foo = React.forwardRef((props, ref) => (
  <div ref={ref}>Foo</div>
));

const FooWithScroll = withInfiniteScroll(Foo);

或者包装器组件应添加容器DOM元素:

function withInfiniteScroll(Component) {  
  return class extends React.Component {
    // ...same as above

    render() {
      return <div ref={this.ref}><Component {...this.props} /></div>
    }
  };
}