@@ -1187,6 +1187,23 @@ function updateDeferredValue<T>(
1187
1187
return prevValue ;
1188
1188
}
1189
1189
1190
+ function rerenderDeferredValue < T > (
1191
+ value : T ,
1192
+ config : TimeoutConfig | void | null ,
1193
+ ) : T {
1194
+ const [ prevValue , setValue ] = rerenderState ( value ) ;
1195
+ updateEffect ( ( ) => {
1196
+ const previousConfig = ReactCurrentBatchConfig . suspense ;
1197
+ ReactCurrentBatchConfig . suspense = config === undefined ? null : config ;
1198
+ try {
1199
+ setValue ( value ) ;
1200
+ } finally {
1201
+ ReactCurrentBatchConfig . suspense = previousConfig ;
1202
+ }
1203
+ } , [ value , config ] ) ;
1204
+ return prevValue ;
1205
+ }
1206
+
1190
1207
function startTransition ( setPending , config , callback ) {
1191
1208
const priorityLevel = getCurrentPriorityLevel ( ) ;
1192
1209
runWithPriority (
@@ -1232,6 +1249,17 @@ function updateTransition(
1232
1249
return [ start , isPending ] ;
1233
1250
}
1234
1251
1252
+ function rerenderTransition (
1253
+ config : SuspenseConfig | void | null ,
1254
+ ) : [ ( ( ) => void ) => void , boolean ] {
1255
+ const [ isPending , setPending ] = rerenderState ( false ) ;
1256
+ const start = updateCallback ( startTransition . bind ( null , setPending , config ) , [
1257
+ setPending ,
1258
+ config ,
1259
+ ] ) ;
1260
+ return [ start , isPending ] ;
1261
+ }
1262
+
1235
1263
function dispatchAction < S , A > (
1236
1264
fiber : Fiber ,
1237
1265
queue : UpdateQueue < S , A > ,
@@ -1409,8 +1437,8 @@ const HooksDispatcherOnRerender: Dispatcher = {
1409
1437
useState : rerenderState ,
1410
1438
useDebugValue : updateDebugValue ,
1411
1439
useResponder : createDeprecatedResponderListener ,
1412
- useDeferredValue : updateDeferredValue ,
1413
- useTransition : updateTransition ,
1440
+ useDeferredValue : rerenderDeferredValue ,
1441
+ useTransition : rerenderTransition ,
1414
1442
} ;
1415
1443
1416
1444
let HooksDispatcherOnMountInDEV : Dispatcher | null = null ;
@@ -1902,14 +1930,14 @@ if (__DEV__) {
1902
1930
useDeferredValue < T > ( value : T , config : TimeoutConfig | void | null ) : T {
1903
1931
currentHookNameInDev = 'useDeferredValue ';
1904
1932
updateHookTypesDev ( ) ;
1905
- return updateDeferredValue ( value , config ) ;
1933
+ return rerenderDeferredValue ( value , config ) ;
1906
1934
} ,
1907
1935
useTransition (
1908
1936
config : SuspenseConfig | void | null ,
1909
1937
) : [ ( ( ) => void ) => void , boolean ] {
1910
1938
currentHookNameInDev = 'useTransition ';
1911
1939
updateHookTypesDev ( ) ;
1912
- return updateTransition ( config ) ;
1940
+ return rerenderTransition ( config ) ;
1913
1941
} ,
1914
1942
} ;
1915
1943
@@ -2294,15 +2322,15 @@ if (__DEV__) {
2294
2322
currentHookNameInDev = 'useDeferredValue ';
2295
2323
warnInvalidHookAccess ( ) ;
2296
2324
updateHookTypesDev ( ) ;
2297
- return updateDeferredValue ( value , config ) ;
2325
+ return rerenderDeferredValue ( value , config ) ;
2298
2326
} ,
2299
2327
useTransition (
2300
2328
config : SuspenseConfig | void | null ,
2301
2329
) : [ ( ( ) => void ) => void , boolean ] {
2302
2330
currentHookNameInDev = 'useTransition ';
2303
2331
warnInvalidHookAccess ( ) ;
2304
2332
updateHookTypesDev ( ) ;
2305
- return updateTransition ( config ) ;
2333
+ return rerenderTransition ( config ) ;
2306
2334
} ,
2307
2335
} ;
2308
2336
}
0 commit comments