Skip to content

Commit 71a8118

Browse files
committed
Reduce branching. Make assignment more consistent
1 parent 47be9e7 commit 71a8118

File tree

2 files changed

+23
-20
lines changed

2 files changed

+23
-20
lines changed

packages/react-dom/src/__tests__/ReactDOMInput-test.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1593,7 +1593,7 @@ describe('ReactDOMInput', () => {
15931593
var node = container.firstChild;
15941594

15951595
expect(node.value).toBe('');
1596-
expect(node.getAttribute('value')).toBe(null);
1596+
expect(node.getAttribute('value')).toBe('');
15971597
});
15981598

15991599
it('does not update the value to a Symbol', function() {
@@ -1612,7 +1612,7 @@ describe('ReactDOMInput', () => {
16121612
var node = container.firstChild;
16131613

16141614
expect(node.value).toBe('');
1615-
expect(node.getAttribute('value')).toBe(null);
1615+
expect(node.getAttribute('value')).toBe('');
16161616
});
16171617

16181618
it('does not update defaultValue to a Symbol', function() {
@@ -1633,7 +1633,7 @@ describe('ReactDOMInput', () => {
16331633
var node = container.firstChild;
16341634

16351635
expect(node.value).toBe('');
1636-
expect(node.getAttribute('value')).toBe(null);
1636+
expect(node.getAttribute('value')).toBe('');
16371637
});
16381638

16391639
it('does not update the value to a function', function() {
@@ -1652,7 +1652,7 @@ describe('ReactDOMInput', () => {
16521652
var node = container.firstChild;
16531653

16541654
expect(node.value).toBe('');
1655-
expect(node.getAttribute('value')).toBe(null);
1655+
expect(node.getAttribute('value')).toBe('');
16561656
});
16571657

16581658
it('does not update defaultValue to a function', function() {

packages/react-dom/src/client/ReactDOMFiberInput.js

+19-16
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,17 @@ export function initWrapperState(element: Element, props: Object) {
118118
}
119119

120120
var defaultValue = props.defaultValue == null ? '' : props.defaultValue;
121+
var initialValue = props.value != null ? props.value : defaultValue;
121122
var node = ((element: any): InputWithWrapperState);
123+
124+
if (!shouldSetAttribute('value', initialValue)) {
125+
initialValue = '';
126+
}
127+
122128
node._wrapperState = {
123129
initialChecked:
124130
props.checked != null ? props.checked : props.defaultChecked,
125-
initialValue: props.value != null ? props.value : defaultValue,
131+
initialValue: initialValue,
126132
controlled: isControlled(props),
127133
};
128134
}
@@ -200,11 +206,11 @@ export function updateWrapper(element: Element, props: Object) {
200206
} else if (node.value !== '' + value) {
201207
node.value = '' + value;
202208
}
209+
}
210+
211+
if (props.hasOwnProperty('value')) {
203212
synchronizeDefaultValue(node, props.type, value);
204-
} else if (
205-
props.hasOwnProperty('value') ||
206-
props.hasOwnProperty('defaultValue')
207-
) {
213+
} else if (props.hasOwnProperty('defaultValue')) {
208214
synchronizeDefaultValue(node, props.type, defaultValue);
209215
}
210216

@@ -215,21 +221,18 @@ export function updateWrapper(element: Element, props: Object) {
215221

216222
export function postMountWrapper(element: Element, props: Object) {
217223
var node = ((element: any): InputWithWrapperState);
218-
var initialValue = node._wrapperState.initialValue;
219224

220-
if (props.value != null || props.defaultValue != null) {
225+
if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) {
221226
// Do not assign value if it is already set. This prevents user text input
222227
// from being lost during SSR hydration.
223-
if (node.value === '' && shouldSetAttribute('value', initialValue)) {
224-
node.value = '' + initialValue;
228+
if (node.value === '') {
229+
node.value = '' + node._wrapperState.initialValue;
225230
}
226231

227232
// value must be assigned before defaultValue. This fixes an issue where the
228233
// visually displayed value of date inputs disappears on mobile Safari and Chrome:
229234
// https://github.com/facebook/react/issues/7233
230-
if (shouldSetAttribute('value', initialValue)) {
231-
node.defaultValue = '' + initialValue;
232-
}
235+
node.defaultValue = '' + node._wrapperState.initialValue;
233236
}
234237

235238
// Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug
@@ -320,10 +323,10 @@ export function synchronizeDefaultValue(
320323
type !== 'number' ||
321324
node.ownerDocument.activeElement !== node
322325
) {
323-
var nextValue =
324-
'' + (value == null ? node._wrapperState.initialValue : value);
325-
if (nextValue !== node.defaultValue) {
326-
node.defaultValue = nextValue;
326+
if (value == null) {
327+
node.defaultValue = '' + node._wrapperState.initialValue;
328+
} else if (node.defaultValue !== '' + value) {
329+
node.defaultValue = '' + value;
327330
}
328331
}
329332
}

0 commit comments

Comments
 (0)