From 0a7d4bd7efc3ffc31e2a01379139e764ddfaaccb Mon Sep 17 00:00:00 2001 From: jdecroock Date: Thu, 27 Oct 2022 00:52:56 +0200 Subject: [PATCH] backport test from #3779 --- test/browser/fragments.test.js | 51 ++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/test/browser/fragments.test.js b/test/browser/fragments.test.js index cec7319abb..fdaf6d5be3 100644 --- a/test/browser/fragments.test.js +++ b/test/browser/fragments.test.js @@ -84,6 +84,57 @@ describe('Fragment', () => { ]); }); + it('should not remove keyed elements', () => { + let deleteItem = () => {}; + const Element = ({ item, deleteItem }) => ( + +
Item: {item}
+ {''} {/* If you delete this, it works fine. */} +
+ ); + + class App extends Component { + constructor(props) { + super(props); + this.state = { + items: Array(10) + .fill() + .map((_, i) => i) + }; + } + + render(_props, state) { + deleteItem = () => { + this.setState({ + items: this.state.items.filter(i => i !== this.state.items[2]) + }); + }; + + return state.items.map(item => ( + + )); + } + } + + render(, scratch); + expect(scratch.innerHTML).to.equal( + '
Item: 0
Item: 1
Item: 2
Item: 3
Item: 4
Item: 5
Item: 6
Item: 7
Item: 8
Item: 9
' + ); + + clearLog(); + deleteItem(); + rerender(); + + expect(scratch.innerHTML).to.equal( + '
Item: 0
Item: 1
Item: 3
Item: 4
Item: 5
Item: 6
Item: 7
Item: 8
Item: 9
' + ); + expectDomLogToBe([ + '
Item: 2.remove()', + '#text.remove()', + '#text.remove()' + ]); + }); + it('should render multiple children via noop renderer', () => { render(