}
handleIntersection = (entry) => {
- const { onHeightChange, saveHeightKey, id } = this.props;
+ this.entry = entry;
- if (this.node && this.node.children.length !== 0) {
- // save the height of the fully-rendered element
- this.height = getRectFromEntry(entry).height;
+ scheduleIdleTask(this.calculateHeight);
+ this.setState(this.updateStateAfterIntersection);
+ }
- if (onHeightChange && saveHeightKey) {
- onHeightChange(saveHeightKey, id, this.height);
- }
+ updateStateAfterIntersection = (prevState) => {
+ if (prevState.isIntersecting && !this.entry.isIntersecting) {
+ scheduleIdleTask(this.hideIfNotIntersecting);
}
+ return {
+ isIntersecting: this.entry.isIntersecting,
+ isHidden: false,
+ };
+ }
- this.setState((prevState) => {
- if (prevState.isIntersecting && !entry.isIntersecting) {
- scheduleIdleTask(this.hideIfNotIntersecting);
- }
- return {
- isIntersecting: entry.isIntersecting,
- isHidden: false,
- };
- });
+ calculateHeight = () => {
+ const { onHeightChange, saveHeightKey, id } = this.props;
+ // save the height of the fully-rendered element (this is expensive
+ // on Chrome, where we need to fall back to getBoundingClientRect)
+ this.height = getRectFromEntry(this.entry).height;
+
+ if (onHeightChange && saveHeightKey) {
+ onHeightChange(saveHeightKey, id, this.height);
+ }
}
hideIfNotIntersecting = () => {