diff --git a/src/diff/props.js b/src/diff/props.js index bbf0ed62b9..a756e71afc 100644 --- a/src/diff/props.js +++ b/src/diff/props.js @@ -78,6 +78,8 @@ export function setProperty(dom, name, value, oldValue, isSvg) { // cast to `0` instead name !== 'tabIndex' && name !== 'download' && + name !== 'rowSpan' && + name !== 'colSpan' && name in dom ) { try { diff --git a/test/browser/render.test.js b/test/browser/render.test.js index 84fa64e9aa..6fcb0dc355 100644 --- a/test/browser/render.test.js +++ b/test/browser/render.test.js @@ -1244,4 +1244,46 @@ describe('render()', () => { expect(items[0]).to.have.property('parentNode').that.should.exist; expect(items[1]).to.have.property('parentNode').that.should.exist; }); + + // Test for #3969 + it('should clear rowspan and colspan', () => { + let update; + class App extends Component { + constructor(props) { + super(props); + this.state = { active: true }; + update = this.setState.bind(this); + } + + render() { + return ( +
+ {this.state.active ? ( + + + + +
+ Foo +
+ ) : ( + + + + +
Foo
+ )} +
+ ); + } + } + + render(, scratch); + + update({ active: false }); + rerender(); + + expect(scratch.querySelector('td[rowspan]')).to.equal(null); + expect(scratch.querySelector('td[colspan]')).to.equal(null); + }); });