diff options
author | Thibaut Girka <thib@sitedethib.com> | 2019-06-30 10:24:56 +0200 |
---|---|---|
committer | ThibG <thib@sitedethib.com> | 2019-07-01 19:31:10 +0200 |
commit | c0b5ee315dcf6ae5d716eaf5756348ef096397ef (patch) | |
tree | c3d0eb2adabcbc110af8c87aab798c209a0bf610 /app | |
parent | 0ef6a114e7f7b77ddbb279d5d73288b125e8851a (diff) |
Revert to using upstream's optimisations
This *does* break things, as `shouldComponentUpdate` assume the children to never change!
Diffstat (limited to 'app')
-rw-r--r-- | app/javascript/flavours/glitch/components/intersection_observer_article.js | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/app/javascript/flavours/glitch/components/intersection_observer_article.js b/app/javascript/flavours/glitch/components/intersection_observer_article.js index 295347c29..2a99a2620 100644 --- a/app/javascript/flavours/glitch/components/intersection_observer_article.js +++ b/app/javascript/flavours/glitch/components/intersection_observer_article.js @@ -3,8 +3,14 @@ import PropTypes from 'prop-types'; import ImmutablePureComponent from 'react-immutable-pure-component'; import scheduleIdleTask from 'flavours/glitch/util/schedule_idle_task'; import getRectFromEntry from 'flavours/glitch/util/get_rect_from_entry'; +import { is } from 'immutable'; -export default class IntersectionObserverArticle extends ImmutablePureComponent { +// Diff these props in the "rendered" state +const updateOnPropsForRendered = ['id', 'index', 'listLength']; +// Diff these props in the "unrendered" state +const updateOnPropsForUnrendered = ['id', 'index', 'listLength', 'cachedHeight']; + +export default class IntersectionObserverArticle extends React.Component { static propTypes = { intersectionObserverWrapper: PropTypes.object.isRequired, @@ -22,20 +28,18 @@ export default class IntersectionObserverArticle extends ImmutablePureComponent } shouldComponentUpdate (nextProps, nextState) { - if (!nextState.isIntersecting && nextState.isHidden) { - // It's only if we're not intersecting (i.e. offscreen) and isHidden is true - // that either "isIntersecting" or "isHidden" matter, and then they're - // the only things that matter (and updated ARIA attributes). - return this.state.isIntersecting || !this.state.isHidden || nextProps.listLength !== this.props.listLength; - } else if (nextState.isIntersecting && !this.state.isIntersecting) { - // If we're going from a non-intersecting state to an intersecting state, - // (i.e. offscreen to onscreen), then we definitely need to re-render + const isUnrendered = !this.state.isIntersecting && (this.state.isHidden || this.props.cachedHeight); + const willBeUnrendered = !nextState.isIntersecting && (nextState.isHidden || nextProps.cachedHeight); + if (!!isUnrendered !== !!willBeUnrendered) { + // If we're going from rendered to unrendered (or vice versa) then update return true; } - // Otherwise, diff based on "updateOnProps" and "updateOnStates" - return super.shouldComponentUpdate(nextProps, nextState); + // Otherwise, diff based on props + const propsToDiff = isUnrendered ? updateOnPropsForUnrendered : updateOnPropsForRendered; + return !propsToDiff.every(prop => is(nextProps[prop], this.props[prop])); } + componentDidMount () { const { intersectionObserverWrapper, id } = this.props; |