From de388d2066df632b10c57644b9643164a39ff426 Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Wed, 25 Sep 2019 20:53:33 +0200 Subject: [PATCH] (fix) - make shallowDiffers take __source in account --- compat/src/index.js | 4 ++-- compat/test/browser/component.test.js | 28 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/compat/src/index.js b/compat/src/index.js index 999c8e24f5..2855eb5cfc 100644 --- a/compat/src/index.js +++ b/compat/src/index.js @@ -303,8 +303,8 @@ let classNameDescriptor = { * @returns {boolean} */ function shallowDiffers(a, b) { - for (let i in a) if (!(i in b)) return true; - for (let i in b) if (a[i]!==b[i]) return true; + for (let i in a) if (i !== '__source' && !(i in b)) return true; + for (let i in b) if (i !== '__source' && a[i]!==b[i]) return true; return false; } diff --git a/compat/test/browser/component.test.js b/compat/test/browser/component.test.js index 95538707e7..0138067db8 100644 --- a/compat/test/browser/component.test.js +++ b/compat/test/browser/component.test.js @@ -95,6 +95,34 @@ describe('components', () => { expect(spy).to.be.calledWithMatch(expected, expected); }); + it('should ignore the __source variable', () => { + const pureSpy = sinon.spy(); + const appSpy = sinon.spy(); + let set; + class Pure extends React.PureComponent { + render() { + pureSpy(); + return
Static
; + } + } + + const App = () => { + const [, setState] = React.useState(0); + appSpy(); + set = setState; + return ; + }; + + React.render(, scratch); + expect(appSpy).to.be.calledOnce; + expect(pureSpy).to.be.calledOnce; + + set(1); + rerender(); + expect(appSpy).to.be.calledTwice; + expect(pureSpy).to.be.calledOnce; + }); + it('should only re-render when props or state change', () => { class C extends React.PureComponent { render() {