Skip to content

Commit d16fb42

Browse files
fix(react-router): ensure updated context in beforeLoad when returning same properties (#3095)
fixes #3051
1 parent d873999 commit d16fb42

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

packages/react-router/src/router.ts

-1
Original file line numberDiff line numberDiff line change
@@ -2397,7 +2397,6 @@ export class Router<
23972397
context: {
23982398
...getParentMatchContext(),
23992399
...prev.__routeContext,
2400-
...prev.__beforeLoadContext,
24012400
},
24022401
}))
24032402

packages/react-router/tests/routeContext.test.tsx

+53
Original file line numberDiff line numberDiff line change
@@ -1407,6 +1407,59 @@ describe('beforeLoad in the route definition', () => {
14071407
expect(mock).toHaveBeenCalledWith({ foo: 'bar', layout: 'layout' })
14081408
expect(mock).toHaveBeenCalledTimes(1)
14091409
})
1410+
1411+
test('child route receives updated values after the values were previously returned by the child route and then updated by the parent route', async () => {
1412+
const mockIndexBeforeLoadFn = vi.fn()
1413+
let counter = 0
1414+
1415+
const rootRoute = createRootRoute({
1416+
beforeLoad: () => {
1417+
counter++
1418+
return {
1419+
counter,
1420+
}
1421+
},
1422+
})
1423+
const indexRoute = createRoute({
1424+
getParentRoute: () => rootRoute,
1425+
path: '/',
1426+
beforeLoad: ({ context }) => {
1427+
mockIndexBeforeLoadFn(context)
1428+
return {
1429+
counter: context.counter,
1430+
}
1431+
},
1432+
component: () => {
1433+
const { counter } = indexRoute.useRouteContext()
1434+
return (
1435+
<div>
1436+
<span data-testid="index-page">Index page</span>
1437+
<span data-testid="counter">{counter}</span>
1438+
</div>
1439+
)
1440+
},
1441+
})
1442+
const routeTree = rootRoute.addChildren([indexRoute])
1443+
const router = createRouter({ routeTree, history })
1444+
1445+
render(<RouterProvider router={router} />)
1446+
1447+
const rootElement = await screen.findByTestId('index-page')
1448+
expect(rootElement).toBeInTheDocument()
1449+
1450+
async function check(expectedCounter: number) {
1451+
const counterElement = await screen.findByTestId('counter')
1452+
expect(counterElement).toHaveTextContent(`${expectedCounter}`)
1453+
1454+
expect(mockIndexBeforeLoadFn).toHaveBeenCalledWith({
1455+
counter: expectedCounter,
1456+
})
1457+
}
1458+
1459+
await check(1)
1460+
await router.invalidate()
1461+
await check(2)
1462+
})
14101463
})
14111464

14121465
describe('loader in the route definition', () => {

0 commit comments

Comments
 (0)