有什么方法可以获取包装组件的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);
答案 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>
}
};
}