diff --git a/packages/react-router/src/Matches.tsx b/packages/react-router/src/Matches.tsx
index 74cc825ce..8e426d03c 100644
--- a/packages/react-router/src/Matches.tsx
+++ b/packages/react-router/src/Matches.tsx
@@ -109,15 +109,11 @@ export function Matches() {
) : null
- const ResolvedSuspense = !router.state.matches.length
- ? React.Suspense
- : SafeFragment
-
const inner = (
-
+
-
+
)
return router.options.InnerWrap ? (
diff --git a/packages/react-router/src/useNavigate.tsx b/packages/react-router/src/useNavigate.tsx
index 93b8bdbd8..573b169e6 100644
--- a/packages/react-router/src/useNavigate.tsx
+++ b/packages/react-router/src/useNavigate.tsx
@@ -23,15 +23,15 @@ export function useNavigate<
>(_defaultOpts?: {
from?: FromPathOption
}): UseNavigateResult {
- const router = useRouter()
+ const { navigate } = useRouter()
return React.useCallback(
(options: NavigateOptions) => {
- return router.navigate({
+ return navigate({
...options,
})
},
- [router],
+ [navigate],
) as UseNavigateResult
}
@@ -58,7 +58,6 @@ export function Navigate<
TMaskTo extends string = '',
>(props: NavigateOptions): null {
const { navigate } = useRouter()
- const match = useMatch({ strict: false })
React.useEffect(() => {
navigate({
diff --git a/packages/react-router/tests/link.test.tsx b/packages/react-router/tests/link.test.tsx
index afed66b8d..d3f5ec5e6 100644
--- a/packages/react-router/tests/link.test.tsx
+++ b/packages/react-router/tests/link.test.tsx
@@ -1,10 +1,11 @@
-import React from 'react'
+import React, { useRef } from 'react'
import '@testing-library/jest-dom/vitest'
import { afterEach, describe, expect, it, test, vi } from 'vitest'
import {
cleanup,
fireEvent,
render,
+ renderHook,
screen,
waitFor,
} from '@testing-library/react'
@@ -25,6 +26,7 @@ import {
useMatchRoute,
useParams,
useRouteContext,
+ useRouterState,
useSearch,
} from '../src'
@@ -34,6 +36,73 @@ afterEach(() => {
})
describe('Link', () => {
+ test('when using renderHook it returns a hook with same content to prove rerender works', async () => {
+ /**
+ * This is the hook that will be testet.
+ *
+ * @returns custom state
+ */
+ const useLocationFromState = () => {
+ const { location } = useRouterState()
+
+ // could return anything just to prove it will work.
+ const memoLocation = React.useMemo(() => {
+ return {
+ href: location.href,
+ pathname: location.pathname,
+ }
+ }, [location.href, location.pathname])
+
+ return memoLocation
+ }
+
+ const IndexComponent = ({ children }: { children: React.ReactNode }) => {
+ return {children}
+ }
+ const RouterContainer = ({ children }: { children: React.ReactNode }) => {
+ const childrenRef = useRef(children)
+ const memoedRouteTree = React.useMemo(() => {
+ const rootRoute = createRootRoute()
+ const indexRoute = createRoute({
+ getParentRoute: () => rootRoute,
+ path: '/',
+ component: () => (
+ {childrenRef.current}
+ ),
+ })
+ return rootRoute.addChildren([indexRoute])
+ }, [])
+
+ const memoedRouter = React.useMemo(() => {
+ const router = createRouter({
+ routeTree: memoedRouteTree,
+ history: createMemoryHistory({ initialEntries: ['/'] }),
+ })
+
+ return router
+ }, [memoedRouteTree])
+ return
+ }
+
+ const { result, rerender } = renderHook(
+ () => {
+ return useLocationFromState()
+ },
+ { wrapper: RouterContainer },
+ )
+ await waitFor(() => expect(screen.getByTestId('testId')).toBeVisible())
+ expect(result.current).toBeTruthy()
+
+ const original = result.current
+
+ rerender()
+
+ await waitFor(() => expect(screen.getByTestId('testId')).toBeVisible())
+ const updated = result.current
+
+ expect(original).toBe(updated)
+ })
+
test('when a Link is disabled', async () => {
const rootRoute = createRootRoute()
const indexRoute = createRoute({