diff --git a/debug/src/debug.js b/debug/src/debug.js index 56998711a1..2704dcfb16 100644 --- a/debug/src/debug.js +++ b/debug/src/debug.js @@ -353,6 +353,10 @@ export function initDebug() { }); } + if (vnode._component === currentComponent) { + renderCount = 0; + } + if ( typeof type === 'string' && (isTableElement(type) || diff --git a/debug/test/browser/debug.test.js b/debug/test/browser/debug.test.js index fa318697d8..1d32129c1f 100644 --- a/debug/test/browser/debug.test.js +++ b/debug/test/browser/debug.test.js @@ -7,6 +7,7 @@ import { } from '../../../test/_util/helpers'; import './fakeDevTools'; import 'preact/debug'; +import { setupRerender } from 'preact/test-utils'; import * as PropTypes from 'prop-types'; // eslint-disable-next-line no-duplicate-imports @@ -20,11 +21,13 @@ describe('debug', () => { let scratch; let errors = []; let warnings = []; + let rerender; beforeEach(() => { errors = []; warnings = []; scratch = setupScratch(); + rerender = setupRerender(); sinon.stub(console, 'error').callsFake(e => errors.push(e)); sinon.stub(console, 'warn').callsFake(w => warnings.push(w)); }); @@ -303,6 +306,23 @@ describe('debug', () => { expect(rerenderCount).to.equal(25); }); + it('does not throw an error if a component renders many times in different cycles', () => { + let rerenderCount = 0; + let set; + function TestComponent() { + const [count, setCount] = useState(0); + set = () => setCount(count + 1); + return
{count}
; + } + + render(, scratch); + for (let i = 0; i < 30; i++) { + set(); + rerender(); + } + expect(scratch.innerHTML).to.equal('
30
'); + }); + describe('duplicate keys', () => { const List = props => ; const ListItem = props =>
  • {props.children}
  • ;