diff --git a/fixtures/dom/src/components/fixtures/number-inputs/NumberInputDecimal.js b/fixtures/dom/src/components/fixtures/number-inputs/NumberInputDecimal.js new file mode 100644 index 0000000000000..552deb04d7d42 --- /dev/null +++ b/fixtures/dom/src/components/fixtures/number-inputs/NumberInputDecimal.js @@ -0,0 +1,33 @@ +const React = window.React; + +import Fixture from '../../Fixture'; + +class NumberInputDecimal extends React.Component { + state = { value: '.98' }; + changeValue = () => { + this.setState({ + value: '0.98', + }); + } + render() { + const {value} = this.state; + return ( + +
{this.props.children}
+ +
+ { + this.setState({value: e.target.value}); + }} + /> + +
+
+ ); + } +} + +export default NumberInputDecimal; diff --git a/src/renderers/dom/client/wrappers/ReactDOMInput.js b/src/renderers/dom/client/wrappers/ReactDOMInput.js index 0eb9509a7337f..73ae197dc2c21 100644 --- a/src/renderers/dom/client/wrappers/ReactDOMInput.js +++ b/src/renderers/dom/client/wrappers/ReactDOMInput.js @@ -220,8 +220,12 @@ var ReactDOMInput = { // Simulate `input.valueAsNumber`. IE9 does not support it var valueAsNumber = parseFloat(node.value, 10) || 0; - // eslint-disable-next-line - if (value != valueAsNumber) { + if ( + // eslint-disable-next-line + value != valueAsNumber || + // eslint-disable-next-line + (value == valueAsNumber && node.value != value) + ) { // Cast `value` to a string to ensure the value is set correctly. While // browsers typically do this as necessary, jsdom doesn't. node.value = '' + value; diff --git a/src/renderers/dom/client/wrappers/__tests__/ReactDOMInput-test.js b/src/renderers/dom/client/wrappers/__tests__/ReactDOMInput-test.js index ababb9120c202..4c099ee9dfcfe 100644 --- a/src/renderers/dom/client/wrappers/__tests__/ReactDOMInput-test.js +++ b/src/renderers/dom/client/wrappers/__tests__/ReactDOMInput-test.js @@ -86,6 +86,23 @@ describe('ReactDOMInput', () => { }); }); + it('does change the string ".98" to "0.98" with no change handler', () => { + class Stub extends React.Component { + state = { + value: '.98', + }; + render() { + return ; + } + } + + var stub = ReactTestUtils.renderIntoDocument(); + var node = ReactDOM.findDOMNode(stub); + stub.setState({value: '0.98'}); + + expect(node.value).toEqual('0.98'); + }); + it('should display `defaultValue` of number 0', () => { var stub = ; stub = ReactTestUtils.renderIntoDocument(stub);