13
import {getFiberCurrentPropsFromNode} from './ReactDOMComponentTree';
14
import {getToStringValue, toString} from './ToStringValue';
15
import {track, trackHydrated, updateValueIfChanged} from './inputValueTracking';
16
-import getActiveElement from './getActiveElement';
16
import {
17
disableInputAttributeSyncing,
18
enableHydrationChangeEvent,
120
if (value != null) {
121
if (type === 'number') {
122
if (
123
+ // "" == 0, so a cleared field wouldn't otherwise be restored to 0.
124
// $FlowFixMe[incompatible-type]
125
// $FlowFixMe[invalid-compare]
126
(value === 0 && node.value === '') ||
127
- // We explicitly want to coerce to number here if possible.
127
+ // We explicitly want to coerce to number here if possible, so that
128
+ // other spellings of the same number (e.g. "0.0" mid-edit) aren't
129
+ // clobbered while the user types.
130
// eslint-disable-next-line
131
node.value != (value as any)
132
) {
146
// whenever the defaultValue React prop has changed. When not present,
147
// React does nothing
148
if (defaultValue != null) {
147
- setDefaultValue(node, type, getToStringValue(defaultValue));
149
+ setDefaultValue(node, getToStringValue(defaultValue));
150
} else if (lastDefaultValue != null) {
151
node.removeAttribute('value');
152
}
157
// 2. The defaultValue React property
158
// 3. Otherwise there should be no change
159
if (value != null) {
158
- setDefaultValue(node, type, getToStringValue(value));
160
+ if (
161
+ type === 'number' &&
162
+ // We explicitly want to coerce to number here if possible.
163
+ // eslint-disable-next-line
164
+ node.value == (value as any)
165
+ ) {
166
+ // node.value may be a different spelling of the same number (e.g.
167
+ // "0.0" for 0). Mirror what's displayed, like the value setter does.
168
+ // Not redundant with the assignment above: browsers sanitize invalid
169
+ // assigned values to "", in which case we sync the React value below.
170
+ setDefaultValue(node, getToStringValue(node.value));
171
+ } else {
172
+ setDefaultValue(node, getToStringValue(value));
173
+ }
174
} else if (defaultValue != null) {
160
- setDefaultValue(node, type, getToStringValue(defaultValue));
175
+ setDefaultValue(node, getToStringValue(defaultValue));
176
} else if (lastDefaultValue != null) {
177
node.removeAttribute('value');
178
}
477
}
478
}
479
465
-// In Chrome, assigning defaultValue to certain input types triggers input validation.
466
-// For number inputs, the display value loses trailing decimal points. For email inputs,
467
-// Chrome raises "The specified value <x> is not a valid email address".
468
-//
469
-// Here we check to see if the defaultValue has actually changed, avoiding these problems
470
-// when the user is inputting text
471
-//
472
-// https://github.com/facebook/react/issues/7253
473
-export function setDefaultValue(
474
- node: HTMLInputElement,
475
- type: ?string,
476
- value: ToStringValue,
477
-) {
478
- if (
479
- // Focused number inputs synchronize on blur. See ChangeEventPlugin.js
480
- type !== 'number' ||
481
- getActiveElement(node.ownerDocument) !== node
482
- ) {
483
- if (node.defaultValue !== toString(value)) {
484
- node.defaultValue = toString(value);
485
- }
480
+function setDefaultValue(node: HTMLInputElement, value: ToStringValue) {
481
+ if (node.defaultValue !== toString(value)) {
482
+ node.defaultValue = toString(value);
483
}
484
}