diff --git a/packages/react-dom-bindings/src/client/ReactDOMTextarea.js b/packages/react-dom-bindings/src/client/ReactDOMTextarea.js index 544cee9952be9..c9862c9b00bef 100644 --- a/packages/react-dom-bindings/src/client/ReactDOMTextarea.js +++ b/packages/react-dom-bindings/src/client/ReactDOMTextarea.js @@ -61,12 +61,6 @@ export function validateTextareaProps(element: Element, props: Object) { export function updateTextarea(element: Element, props: Object) { const node: HTMLTextAreaElement = (element: any); const value = getToStringValue(props.value); - const defaultValue = getToStringValue(props.defaultValue); - if (defaultValue != null) { - node.defaultValue = toString(defaultValue); - } else { - node.defaultValue = ''; - } if (value != null) { // Cast `value` to a string to ensure the value is set correctly. While // browsers typically do this as necessary, jsdom doesn't. @@ -76,10 +70,19 @@ export function updateTextarea(element: Element, props: Object) { node.value = newValue; } // TOOO: This should respect disableInputAttributeSyncing flag. - if (props.defaultValue == null && node.defaultValue !== newValue) { - node.defaultValue = newValue; + if (props.defaultValue == null) { + if (node.defaultValue !== newValue) { + node.defaultValue = newValue; + } + return; } } + const defaultValue = getToStringValue(props.defaultValue); + if (defaultValue != null) { + node.defaultValue = toString(defaultValue); + } else { + node.defaultValue = ''; + } } export function initTextarea(element: Element, props: Object) { diff --git a/packages/react-dom/src/__tests__/ReactDOMTextarea-test.js b/packages/react-dom/src/__tests__/ReactDOMTextarea-test.js index 396eef8d6d34e..347942234063d 100644 --- a/packages/react-dom/src/__tests__/ReactDOMTextarea-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMTextarea-test.js @@ -603,6 +603,7 @@ describe('ReactDOMTextarea', () => { ref={n => (node = n)} value="foo" onChange={emptyFunction} + data-count={this.state.count} /> );