Skip to content

Commit b0c3b3b

Browse files
committed
fix(reobserve): Prevent unnecessary reobserve() calls when re-rendering
In some cases it's possible that the target node changed and there's a need to reobserve it. When that happens a flag was stale and subsequent re-renders cause reobserve() to be called always. This fix sets the flag value back to false on the second re-render so that this behavior gets resetted.
1 parent cd94848 commit b0c3b3b

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

src/IntersectionObserver.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ export default class IntersectionObserver extends React.Component {
129129
if (this.renderedTarget && target && this.renderedTarget !== target) {
130130
this.unobserve();
131131
this.targetChanged = true;
132+
} else {
133+
this.targetChanged = false;
132134
}
133135
this.target = target;
134136
};

src/__tests__/IntersectionObserver.spec.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,40 @@ describe('update', () => {
263263

264264
expect(spy).not.toBeCalled();
265265
});
266+
267+
test('should not reobserve on a second render after root changed the first time', () => {
268+
const component = (
269+
<IntersectionObserver onChange={noop}>
270+
<span />
271+
</IntersectionObserver>
272+
);
273+
let called = false;
274+
const tree = renderer.create(component, {
275+
createNodeMock() {
276+
if (called) {
277+
return target;
278+
}
279+
called = true;
280+
return Object.assign({ id: 2 }, target);
281+
},
282+
});
283+
const instance = tree.getInstance();
284+
const spy = jest.spyOn(instance, 'reobserve');
285+
286+
tree.update(
287+
<IntersectionObserver onChange={noop}>
288+
<div />
289+
</IntersectionObserver>,
290+
);
291+
292+
tree.update(
293+
<IntersectionObserver onChange={noop}>
294+
<div key="forcesRender" />
295+
</IntersectionObserver>,
296+
);
297+
298+
expect(spy).toHaveBeenCalledTimes(1);
299+
});
266300
});
267301

268302
describe('callback', () => {

0 commit comments

Comments
 (0)