diff --git a/src/diff/props.js b/src/diff/props.js index b0f2f9ee39..de0abc07c6 100644 --- a/src/diff/props.js +++ b/src/diff/props.js @@ -117,6 +117,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 a8d7e00cc7..dc04ca3011 100644 --- a/test/browser/render.test.js +++ b/test/browser/render.test.js @@ -414,6 +414,48 @@ describe('render()', () => { }); } + // 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); + }); + // Test for preactjs/preact#651 it('should set enumerable boolean attribute', () => { render(, scratch);