@@ -1198,6 +1198,26 @@ function updateDeferredValue<T>(
1198
1198
return prevValue ;
1199
1199
}
1200
1200
1201
+ function rerenderDeferredValue< T > (
1202
+ value: T,
1203
+ config: TimeoutConfig | void | null,
1204
+ ): T {
1205
+ const [ prevValue , setValue ] = rerenderState ( value ) ;
1206
+ updateEffect (
1207
+ ( ) => {
1208
+ const previousConfig = ReactCurrentBatchConfig . suspense ;
1209
+ ReactCurrentBatchConfig . suspense = config === undefined ? null : config ;
1210
+ try {
1211
+ setValue ( value ) ;
1212
+ } finally {
1213
+ ReactCurrentBatchConfig . suspense = previousConfig ;
1214
+ }
1215
+ } ,
1216
+ [ value , config ] ,
1217
+ ) ;
1218
+ return prevValue ;
1219
+ }
1220
+
1201
1221
function startTransition(setPending, config, callback) {
1202
1222
const priorityLevel = getCurrentPriorityLevel ( ) ;
1203
1223
runWithPriority (
@@ -1243,6 +1263,17 @@ function updateTransition(
1243
1263
return [ start , isPending ] ;
1244
1264
}
1245
1265
1266
+ function rerenderTransition(
1267
+ config: SuspenseConfig | void | null,
1268
+ ): [(() => void ) => void , boolean ] {
1269
+ const [ isPending , setPending ] = rerenderState ( false ) ;
1270
+ const start = updateCallback ( startTransition . bind ( null , setPending , config ) , [
1271
+ setPending ,
1272
+ config ,
1273
+ ] ) ;
1274
+ return [ start , isPending ] ;
1275
+ }
1276
+
1246
1277
function dispatchAction< S , A > (
1247
1278
fiber: Fiber,
1248
1279
queue: UpdateQueue< S , A > ,
@@ -1420,8 +1451,8 @@ const HooksDispatcherOnRerender: Dispatcher = {
1420
1451
useState : rerenderState ,
1421
1452
useDebugValue : updateDebugValue ,
1422
1453
useResponder : createDeprecatedResponderListener ,
1423
- useDeferredValue : updateDeferredValue ,
1424
- useTransition : updateTransition ,
1454
+ useDeferredValue : rerenderDeferredValue ,
1455
+ useTransition : rerenderTransition ,
1425
1456
} ;
1426
1457
1427
1458
let HooksDispatcherOnMountInDEV: Dispatcher | null = null;
@@ -1913,14 +1944,14 @@ if (__DEV__) {
1913
1944
useDeferredValue< T > (value: T, config: TimeoutConfig | void | null): T {
1914
1945
currentHookNameInDev = 'useDeferredValue' ;
1915
1946
updateHookTypesDev ( ) ;
1916
- return updateDeferredValue ( value , config ) ;
1947
+ return rerenderDeferredValue ( value , config ) ;
1917
1948
} ,
1918
1949
useTransition(
1919
1950
config: SuspenseConfig | void | null,
1920
1951
): [(() => void ) => void , boolean ] {
1921
1952
currentHookNameInDev = 'useTransition' ;
1922
1953
updateHookTypesDev ( ) ;
1923
- return updateTransition ( config ) ;
1954
+ return rerenderTransition ( config ) ;
1924
1955
} ,
1925
1956
} ;
1926
1957
@@ -2305,15 +2336,15 @@ if (__DEV__) {
2305
2336
currentHookNameInDev = 'useDeferredValue' ;
2306
2337
warnInvalidHookAccess ( ) ;
2307
2338
updateHookTypesDev ( ) ;
2308
- return updateDeferredValue ( value , config ) ;
2339
+ return rerenderDeferredValue ( value , config ) ;
2309
2340
} ,
2310
2341
useTransition(
2311
2342
config: SuspenseConfig | void | null,
2312
2343
): [(() => void ) => void , boolean ] {
2313
2344
currentHookNameInDev = 'useTransition' ;
2314
2345
warnInvalidHookAccess ( ) ;
2315
2346
updateHookTypesDev ( ) ;
2316
- return updateTransition ( config ) ;
2347
+ return rerenderTransition ( config ) ;
2317
2348
} ,
2318
2349
} ;
2319
2350
}
0 commit comments