File tree Expand file tree Collapse file tree 3 files changed +59
-8
lines changed Expand file tree Collapse file tree 3 files changed +59
-8
lines changed Original file line number Diff line number Diff line change
1
+ ---
2
+ " react-router " : patch
3
+ ---
4
+
5
+ Stabilize ` useRevalidator ` 's ` revalidate ` function
Original file line number Diff line number Diff line change @@ -283,4 +283,48 @@ describe("useRevalidator", () => {
283
283
284
284
expect ( count ) . toBe ( 1 ) ;
285
285
} ) ;
286
+
287
+ it ( "is stable across revalidation changes" , async ( ) => {
288
+ let uiCount = 0 ;
289
+ let stableCount = 0 ;
290
+ let unstableCount = 0 ;
291
+ let router = createMemoryRouter (
292
+ [
293
+ {
294
+ id : "root" ,
295
+ path : "/" ,
296
+ loader : ( ) => ++ uiCount ,
297
+ Component ( ) {
298
+ let { revalidate, state } = useRevalidator ( ) ;
299
+
300
+ React . useEffect ( ( ) => void stableCount ++ , [ revalidate ] ) ;
301
+ React . useEffect ( ( ) => void unstableCount ++ , [ state ] ) ;
302
+
303
+ return (
304
+ < button onClick = { ( ) => revalidate ( ) } >
305
+ Revalidate: { useLoaderData ( ) }
306
+ </ button >
307
+ ) ;
308
+ } ,
309
+ } ,
310
+ ] ,
311
+ {
312
+ hydrationData : {
313
+ loaderData : { root : 0 } ,
314
+ } ,
315
+ }
316
+ ) ;
317
+
318
+ render ( < RouterProvider router = { router } /> ) ;
319
+
320
+ fireEvent . click ( screen . getByText ( "Revalidate: 0" ) ) ;
321
+ await waitFor ( ( ) => screen . getByText ( "Revalidate: 1" ) ) ;
322
+
323
+ fireEvent . click ( screen . getByText ( "Revalidate: 1" ) ) ;
324
+ await waitFor ( ( ) => screen . getByText ( "Revalidate: 2" ) ) ;
325
+
326
+ // idle -> loading -> idle -> loading -> idle
327
+ expect ( unstableCount ) . toBe ( 5 ) ;
328
+ expect ( stableCount ) . toBe ( 1 ) ;
329
+ } ) ;
286
330
} ) ;
Original file line number Diff line number Diff line change @@ -1043,17 +1043,19 @@ export function useNavigation() {
1043
1043
1044
1044
@category Hooks
1045
1045
*/
1046
- export function useRevalidator ( ) {
1046
+ export function useRevalidator ( ) : {
1047
+ revalidate : ( ) => Promise < void > ;
1048
+ state : DataRouter [ "state" ] [ "revalidation" ] ;
1049
+ } {
1047
1050
let dataRouterContext = useDataRouterContext ( DataRouterHook . UseRevalidator ) ;
1048
1051
let state = useDataRouterState ( DataRouterStateHook . UseRevalidator ) ;
1052
+ let revalidate = React . useCallback ( async ( ) => {
1053
+ await dataRouterContext . router . revalidate ( ) ;
1054
+ } , [ dataRouterContext . router ] ) ;
1055
+
1049
1056
return React . useMemo (
1050
- ( ) => ( {
1051
- async revalidate ( ) {
1052
- await dataRouterContext . router . revalidate ( ) ;
1053
- } ,
1054
- state : state . revalidation ,
1055
- } ) ,
1056
- [ dataRouterContext . router , state . revalidation ]
1057
+ ( ) => ( { revalidate, state : state . revalidation } ) ,
1058
+ [ revalidate , state . revalidation ]
1057
1059
) ;
1058
1060
}
1059
1061
You can’t perform that action at this time.
0 commit comments