Skip to content

Commit 7717799

Browse files
committed
Add optional initialValue argument to useDeferredValue (#27500)
Adds a second argument to useDeferredValue called initialValue: ```js const value = useDeferredValue(finalValue, initialValue); ``` During the initial render of a component, useDeferredValue will return initialValue. Once that render finishes, it will spawn an additional render to switch to finalValue. This same sequence should occur whenever the hook is hidden and revealed again, i.e. by a Suspense or Activity, though this part is not yet implemented. When initialValue is not provided, useDeferredValue has no effect during initial render, but during an update, it will remain on the previous value, then spawn an additional render to switch to the new value. (This is the same behavior that exists today.) During SSR, initialValue is always used, if provided. This feature is currently behind an experimental flag. We plan to ship it in a non-breaking release. DiffTrain build for commit be67db4.
1 parent 1e8f15f commit 7717799

File tree

13 files changed

+261
-154
lines changed

13 files changed

+261
-154
lines changed

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react-test-renderer/cjs/ReactTestRenderer-dev.js

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<73b93e8e6858b35c538fb675ac42495a>>
10+
* @generated SignedSource<<97bac0ab36e9567435451d873bea4dcf>>
1111
*/
1212

1313
'use strict';
@@ -8500,34 +8500,41 @@ function updateMemo(nextCreate, deps) {
85008500
return nextValue;
85018501
}
85028502

8503-
function mountDeferredValue(value) {
8503+
function mountDeferredValue(value, initialValue) {
85048504
var hook = mountWorkInProgressHook();
8505-
hook.memoizedState = value;
8506-
return value;
8505+
return mountDeferredValueImpl(hook, value);
85078506
}
85088507

8509-
function updateDeferredValue(value) {
8508+
function updateDeferredValue(value, initialValue) {
85108509
var hook = updateWorkInProgressHook();
85118510
var resolvedCurrentHook = currentHook;
85128511
var prevValue = resolvedCurrentHook.memoizedState;
85138512
return updateDeferredValueImpl(hook, prevValue, value);
85148513
}
85158514

8516-
function rerenderDeferredValue(value) {
8515+
function rerenderDeferredValue(value, initialValue) {
85178516
var hook = updateWorkInProgressHook();
85188517

85198518
if (currentHook === null) {
85208519
// This is a rerender during a mount.
8521-
hook.memoizedState = value;
8522-
return value;
8520+
return mountDeferredValueImpl(hook, value);
85238521
} else {
85248522
// This is a rerender during an update.
85258523
var prevValue = currentHook.memoizedState;
85268524
return updateDeferredValueImpl(hook, prevValue, value);
85278525
}
85288526
}
85298527

8530-
function updateDeferredValueImpl(hook, prevValue, value) {
8528+
function mountDeferredValueImpl(hook, value, initialValue) {
8529+
{
8530+
hook.memoizedState = value;
8531+
return value;
8532+
}
8533+
}
8534+
8535+
function updateDeferredValueImpl(hook, prevValue, value, initialValue) {
8536+
// TODO: We should also check if this component is going from
8537+
// hidden -> visible. If so, it should use the initialValue arg.
85318538
var shouldDeferValue = !includesOnlyNonUrgentLanes(renderLanes$1);
85328539

85338540
if (shouldDeferValue) {
@@ -9187,7 +9194,7 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null;
91879194
mountHookTypesDev();
91889195
return mountDebugValue();
91899196
},
9190-
useDeferredValue: function (value) {
9197+
useDeferredValue: function (value, initialValue) {
91919198
currentHookNameInDev = "useDeferredValue";
91929199
mountHookTypesDev();
91939200
return mountDeferredValue(value);
@@ -9327,7 +9334,7 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null;
93279334
updateHookTypesDev();
93289335
return mountDebugValue();
93299336
},
9330-
useDeferredValue: function (value) {
9337+
useDeferredValue: function (value, initialValue) {
93319338
currentHookNameInDev = "useDeferredValue";
93329339
updateHookTypesDev();
93339340
return mountDeferredValue(value);
@@ -9463,7 +9470,7 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null;
94639470
updateHookTypesDev();
94649471
return updateDebugValue();
94659472
},
9466-
useDeferredValue: function (value) {
9473+
useDeferredValue: function (value, initialValue) {
94679474
currentHookNameInDev = "useDeferredValue";
94689475
updateHookTypesDev();
94699476
return updateDeferredValue(value);
@@ -9603,7 +9610,7 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null;
96039610
updateHookTypesDev();
96049611
return updateDebugValue();
96059612
},
9606-
useDeferredValue: function (value) {
9613+
useDeferredValue: function (value, initialValue) {
96079614
currentHookNameInDev = "useDeferredValue";
96089615
updateHookTypesDev();
96099616
return rerenderDeferredValue(value);
@@ -9759,7 +9766,7 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null;
97599766
mountHookTypesDev();
97609767
return mountDebugValue();
97619768
},
9762-
useDeferredValue: function (value) {
9769+
useDeferredValue: function (value, initialValue) {
97639770
currentHookNameInDev = "useDeferredValue";
97649771
warnInvalidHookAccess();
97659772
mountHookTypesDev();
@@ -9916,7 +9923,7 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null;
99169923
updateHookTypesDev();
99179924
return updateDebugValue();
99189925
},
9919-
useDeferredValue: function (value) {
9926+
useDeferredValue: function (value, initialValue) {
99209927
currentHookNameInDev = "useDeferredValue";
99219928
warnInvalidHookAccess();
99229929
updateHookTypesDev();
@@ -10073,7 +10080,7 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null;
1007310080
updateHookTypesDev();
1007410081
return updateDebugValue();
1007510082
},
10076-
useDeferredValue: function (value) {
10083+
useDeferredValue: function (value, initialValue) {
1007710084
currentHookNameInDev = "useDeferredValue";
1007810085
warnInvalidHookAccess();
1007910086
updateHookTypesDev();
@@ -24773,7 +24780,7 @@ function createFiberRoot(
2477324780
return root;
2477424781
}
2477524782

24776-
var ReactVersion = "18.3.0-canary-77ec61885-20231010";
24783+
var ReactVersion = "18.3.0-canary-be67db46b-20231010";
2477724784

2477824785
// Might add PROFILE later.
2477924786

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react-test-renderer/cjs/ReactTestRenderer-prod.js

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<f640ba136e1c722c9a33b8847c0f8829>>
10+
* @generated SignedSource<<74789ed84a7dc01a6249e9f3418afe20>>
1111
*/
1212

1313
"use strict";
@@ -3124,7 +3124,8 @@ var HooksDispatcherOnMount = {
31243124
},
31253125
useDebugValue: mountDebugValue,
31263126
useDeferredValue: function (value) {
3127-
return (mountWorkInProgressHook().memoizedState = value);
3127+
mountWorkInProgressHook().memoizedState = value;
3128+
return value;
31283129
},
31293130
useTransition: function () {
31303131
var stateHook = mountStateImpl(!1);
@@ -3302,7 +3303,7 @@ var HooksDispatcherOnRerender = {
33023303
useDeferredValue: function (value) {
33033304
var hook = updateWorkInProgressHook();
33043305
return null === currentHook
3305-
? (hook.memoizedState = value)
3306+
? ((hook.memoizedState = value), value)
33063307
: updateDeferredValueImpl(hook, currentHook.memoizedState, value);
33073308
},
33083309
useTransition: function () {
@@ -8973,19 +8974,19 @@ function wrapFiber(fiber) {
89738974
fiberToWrapper.set(fiber, wrapper));
89748975
return wrapper;
89758976
}
8976-
var devToolsConfig$jscomp$inline_998 = {
8977+
var devToolsConfig$jscomp$inline_1008 = {
89778978
findFiberByHostInstance: function () {
89788979
throw Error("TestRenderer does not support findFiberByHostInstance()");
89798980
},
89808981
bundleType: 0,
8981-
version: "18.3.0-canary-77ec61885-20231010",
8982+
version: "18.3.0-canary-be67db46b-20231010",
89828983
rendererPackageName: "react-test-renderer"
89838984
};
8984-
var internals$jscomp$inline_1191 = {
8985-
bundleType: devToolsConfig$jscomp$inline_998.bundleType,
8986-
version: devToolsConfig$jscomp$inline_998.version,
8987-
rendererPackageName: devToolsConfig$jscomp$inline_998.rendererPackageName,
8988-
rendererConfig: devToolsConfig$jscomp$inline_998.rendererConfig,
8985+
var internals$jscomp$inline_1201 = {
8986+
bundleType: devToolsConfig$jscomp$inline_1008.bundleType,
8987+
version: devToolsConfig$jscomp$inline_1008.version,
8988+
rendererPackageName: devToolsConfig$jscomp$inline_1008.rendererPackageName,
8989+
rendererConfig: devToolsConfig$jscomp$inline_1008.rendererConfig,
89898990
overrideHookState: null,
89908991
overrideHookStateDeletePath: null,
89918992
overrideHookStateRenamePath: null,
@@ -9002,26 +9003,26 @@ var internals$jscomp$inline_1191 = {
90029003
return null === fiber ? null : fiber.stateNode;
90039004
},
90049005
findFiberByHostInstance:
9005-
devToolsConfig$jscomp$inline_998.findFiberByHostInstance ||
9006+
devToolsConfig$jscomp$inline_1008.findFiberByHostInstance ||
90069007
emptyFindFiberByHostInstance,
90079008
findHostInstancesForRefresh: null,
90089009
scheduleRefresh: null,
90099010
scheduleRoot: null,
90109011
setRefreshHandler: null,
90119012
getCurrentFiber: null,
9012-
reconcilerVersion: "18.3.0-canary-77ec61885-20231010"
9013+
reconcilerVersion: "18.3.0-canary-be67db46b-20231010"
90139014
};
90149015
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
9015-
var hook$jscomp$inline_1192 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
9016+
var hook$jscomp$inline_1202 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
90169017
if (
9017-
!hook$jscomp$inline_1192.isDisabled &&
9018-
hook$jscomp$inline_1192.supportsFiber
9018+
!hook$jscomp$inline_1202.isDisabled &&
9019+
hook$jscomp$inline_1202.supportsFiber
90199020
)
90209021
try {
9021-
(rendererID = hook$jscomp$inline_1192.inject(
9022-
internals$jscomp$inline_1191
9022+
(rendererID = hook$jscomp$inline_1202.inject(
9023+
internals$jscomp$inline_1201
90239024
)),
9024-
(injectedHook = hook$jscomp$inline_1192);
9025+
(injectedHook = hook$jscomp$inline_1202);
90259026
} catch (err) {}
90269027
}
90279028
exports._Scheduler = Scheduler;

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react-test-renderer/cjs/ReactTestRenderer-profiling.js

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<f131784665b9434c387f5196d96855a8>>
10+
* @generated SignedSource<<82a7b6543c19ebb61157ecb409194495>>
1111
*/
1212

1313
"use strict";
@@ -3144,7 +3144,8 @@ var HooksDispatcherOnMount = {
31443144
},
31453145
useDebugValue: mountDebugValue,
31463146
useDeferredValue: function (value) {
3147-
return (mountWorkInProgressHook().memoizedState = value);
3147+
mountWorkInProgressHook().memoizedState = value;
3148+
return value;
31483149
},
31493150
useTransition: function () {
31503151
var stateHook = mountStateImpl(!1);
@@ -3322,7 +3323,7 @@ var HooksDispatcherOnRerender = {
33223323
useDeferredValue: function (value) {
33233324
var hook = updateWorkInProgressHook();
33243325
return null === currentHook
3325-
? (hook.memoizedState = value)
3326+
? ((hook.memoizedState = value), value)
33263327
: updateDeferredValueImpl(hook, currentHook.memoizedState, value);
33273328
},
33283329
useTransition: function () {
@@ -9399,19 +9400,19 @@ function wrapFiber(fiber) {
93999400
fiberToWrapper.set(fiber, wrapper));
94009401
return wrapper;
94019402
}
9402-
var devToolsConfig$jscomp$inline_1040 = {
9403+
var devToolsConfig$jscomp$inline_1050 = {
94039404
findFiberByHostInstance: function () {
94049405
throw Error("TestRenderer does not support findFiberByHostInstance()");
94059406
},
94069407
bundleType: 0,
9407-
version: "18.3.0-canary-77ec61885-20231010",
9408+
version: "18.3.0-canary-be67db46b-20231010",
94089409
rendererPackageName: "react-test-renderer"
94099410
};
9410-
var internals$jscomp$inline_1232 = {
9411-
bundleType: devToolsConfig$jscomp$inline_1040.bundleType,
9412-
version: devToolsConfig$jscomp$inline_1040.version,
9413-
rendererPackageName: devToolsConfig$jscomp$inline_1040.rendererPackageName,
9414-
rendererConfig: devToolsConfig$jscomp$inline_1040.rendererConfig,
9411+
var internals$jscomp$inline_1242 = {
9412+
bundleType: devToolsConfig$jscomp$inline_1050.bundleType,
9413+
version: devToolsConfig$jscomp$inline_1050.version,
9414+
rendererPackageName: devToolsConfig$jscomp$inline_1050.rendererPackageName,
9415+
rendererConfig: devToolsConfig$jscomp$inline_1050.rendererConfig,
94159416
overrideHookState: null,
94169417
overrideHookStateDeletePath: null,
94179418
overrideHookStateRenamePath: null,
@@ -9428,26 +9429,26 @@ var internals$jscomp$inline_1232 = {
94289429
return null === fiber ? null : fiber.stateNode;
94299430
},
94309431
findFiberByHostInstance:
9431-
devToolsConfig$jscomp$inline_1040.findFiberByHostInstance ||
9432+
devToolsConfig$jscomp$inline_1050.findFiberByHostInstance ||
94329433
emptyFindFiberByHostInstance,
94339434
findHostInstancesForRefresh: null,
94349435
scheduleRefresh: null,
94359436
scheduleRoot: null,
94369437
setRefreshHandler: null,
94379438
getCurrentFiber: null,
9438-
reconcilerVersion: "18.3.0-canary-77ec61885-20231010"
9439+
reconcilerVersion: "18.3.0-canary-be67db46b-20231010"
94399440
};
94409441
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
9441-
var hook$jscomp$inline_1233 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
9442+
var hook$jscomp$inline_1243 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
94429443
if (
9443-
!hook$jscomp$inline_1233.isDisabled &&
9444-
hook$jscomp$inline_1233.supportsFiber
9444+
!hook$jscomp$inline_1243.isDisabled &&
9445+
hook$jscomp$inline_1243.supportsFiber
94459446
)
94469447
try {
9447-
(rendererID = hook$jscomp$inline_1233.inject(
9448-
internals$jscomp$inline_1232
9448+
(rendererID = hook$jscomp$inline_1243.inject(
9449+
internals$jscomp$inline_1242
94499450
)),
9450-
(injectedHook = hook$jscomp$inline_1233);
9451+
(injectedHook = hook$jscomp$inline_1243);
94519452
} catch (err) {}
94529453
}
94539454
exports._Scheduler = Scheduler;

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/cjs/React-dev.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<3f31df2fa14ee4c981d6843f3d4d7ead>>
10+
* @generated SignedSource<<71499eceb285e226843aaef5ea44794f>>
1111
*/
1212

1313
'use strict';
@@ -27,7 +27,7 @@ if (
2727
}
2828
"use strict";
2929

30-
var ReactVersion = "18.3.0-canary-77ec61885-20231010";
30+
var ReactVersion = "18.3.0-canary-be67db46b-20231010";
3131

3232
// ATTENTION
3333
// When adding new symbols to this file,
@@ -2048,9 +2048,9 @@ function useTransition() {
20482048
var dispatcher = resolveDispatcher();
20492049
return dispatcher.useTransition();
20502050
}
2051-
function useDeferredValue(value) {
2051+
function useDeferredValue(value, initialValue) {
20522052
var dispatcher = resolveDispatcher();
2053-
return dispatcher.useDeferredValue(value);
2053+
return dispatcher.useDeferredValue(value, initialValue);
20542054
}
20552055
function useId() {
20562056
var dispatcher = resolveDispatcher();

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/cjs/React-prod.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<436f4c30f340eebaa6d2b53cebf45483>>
10+
* @generated SignedSource<<f2e4a74450979cfc7369836feb51f7b4>>
1111
*/
1212

1313
"use strict";
@@ -569,8 +569,8 @@ exports.useContext = function (Context) {
569569
return ReactCurrentDispatcher.current.useContext(Context);
570570
};
571571
exports.useDebugValue = function () {};
572-
exports.useDeferredValue = function (value) {
573-
return ReactCurrentDispatcher.current.useDeferredValue(value);
572+
exports.useDeferredValue = function (value, initialValue) {
573+
return ReactCurrentDispatcher.current.useDeferredValue(value, initialValue);
574574
};
575575
exports.useEffect = function (create, deps) {
576576
return ReactCurrentDispatcher.current.useEffect(create, deps);
@@ -616,4 +616,4 @@ exports.useSyncExternalStore = function (
616616
exports.useTransition = function () {
617617
return ReactCurrentDispatcher.current.useTransition();
618618
};
619-
exports.version = "18.3.0-canary-77ec61885-20231010";
619+
exports.version = "18.3.0-canary-be67db46b-20231010";

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/cjs/React-profiling.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<afc9b8a86c7cb5b70c67da50c5d06db9>>
10+
* @generated SignedSource<<377c432dea6f7a43c2e92ce91bc02137>>
1111
*/
1212

1313

@@ -572,8 +572,8 @@ exports.useContext = function (Context) {
572572
return ReactCurrentDispatcher.current.useContext(Context);
573573
};
574574
exports.useDebugValue = function () {};
575-
exports.useDeferredValue = function (value) {
576-
return ReactCurrentDispatcher.current.useDeferredValue(value);
575+
exports.useDeferredValue = function (value, initialValue) {
576+
return ReactCurrentDispatcher.current.useDeferredValue(value, initialValue);
577577
};
578578
exports.useEffect = function (create, deps) {
579579
return ReactCurrentDispatcher.current.useEffect(create, deps);
@@ -619,7 +619,7 @@ exports.useSyncExternalStore = function (
619619
exports.useTransition = function () {
620620
return ReactCurrentDispatcher.current.useTransition();
621621
};
622-
exports.version = "18.3.0-canary-77ec61885-20231010";
622+
exports.version = "18.3.0-canary-be67db46b-20231010";
623623

624624
/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
625625
if (
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
77ec61885fb19607cdd116a6790095afa40b5a94
1+
be67db46b60d94f9fbefccf2523429af25873e5b

0 commit comments

Comments
 (0)