@@ -1198,6 +1198,26 @@ function updateDeferredValue<T>(
11981198 return prevValue ;
11991199}
12001200
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+
12011221function startTransition(setPending, config, callback) {
12021222 const priorityLevel = getCurrentPriorityLevel ( ) ;
12031223 runWithPriority (
@@ -1243,6 +1263,17 @@ function updateTransition(
12431263 return [ start , isPending ] ;
12441264}
12451265
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+
12461277function dispatchAction< S , A > (
12471278 fiber: Fiber,
12481279 queue: UpdateQueue< S , A > ,
@@ -1420,8 +1451,8 @@ const HooksDispatcherOnRerender: Dispatcher = {
14201451 useState : rerenderState ,
14211452 useDebugValue : updateDebugValue ,
14221453 useResponder : createDeprecatedResponderListener ,
1423- useDeferredValue : updateDeferredValue ,
1424- useTransition : updateTransition ,
1454+ useDeferredValue : rerenderDeferredValue ,
1455+ useTransition : rerenderTransition ,
14251456} ;
14261457
14271458let HooksDispatcherOnMountInDEV: Dispatcher | null = null;
@@ -1913,14 +1944,14 @@ if (__DEV__) {
19131944 useDeferredValue< T > (value: T, config: TimeoutConfig | void | null): T {
19141945 currentHookNameInDev = 'useDeferredValue' ;
19151946 updateHookTypesDev ( ) ;
1916- return updateDeferredValue ( value , config ) ;
1947+ return rerenderDeferredValue ( value , config ) ;
19171948 } ,
19181949 useTransition(
19191950 config: SuspenseConfig | void | null,
19201951 ): [(() => void ) => void , boolean ] {
19211952 currentHookNameInDev = 'useTransition' ;
19221953 updateHookTypesDev ( ) ;
1923- return updateTransition ( config ) ;
1954+ return rerenderTransition ( config ) ;
19241955 } ,
19251956 } ;
19261957
@@ -2305,15 +2336,15 @@ if (__DEV__) {
23052336 currentHookNameInDev = 'useDeferredValue' ;
23062337 warnInvalidHookAccess ( ) ;
23072338 updateHookTypesDev ( ) ;
2308- return updateDeferredValue ( value , config ) ;
2339+ return rerenderDeferredValue ( value , config ) ;
23092340 } ,
23102341 useTransition(
23112342 config: SuspenseConfig | void | null,
23122343 ): [(() => void ) => void , boolean ] {
23132344 currentHookNameInDev = 'useTransition' ;
23142345 warnInvalidHookAccess ( ) ;
23152346 updateHookTypesDev ( ) ;
2316- return updateTransition ( config ) ;
2347+ return rerenderTransition ( config ) ;
23172348 } ,
23182349 } ;
23192350}
0 commit comments