Files
SnowLuma/.pnpm-store/v11/files/e7/e4d237ecd70d4f78c4b0d1621ea807a24cb436355fd655df3c54c76e193a899f1f05226474b83c551e0ebe6e5d501b41bb5a50bdf034c3e2854168e1a0db0f
T
TanTan 2a69b23b47
Dev Build / cleanup (push) Waiting to run
Dev Build / typecheck (push) Waiting to run
docs: 仓库链接指向本镜像仓库
2026-11-13 09:27:07 +08:00

81 lines
2.3 KiB
Plaintext

'use client'
import * as React from 'react'
import { useLayoutEffect } from './utils'
import { useRouter } from './useRouter'
import type {
AnyRouter,
FromPathOption,
NavigateOptions,
RegisteredRouter,
UseNavigateResult,
} from '@tanstack/router-core'
/**
* Imperative navigation hook.
*
* Returns a stable `navigate(options)` function to change the current location
* programmatically. Prefer the `Link` component for user-initiated navigation,
* and use this hook from effects, callbacks, or handlers where imperative
* navigation is required.
*
* Options:
* - `from`: Optional route base used to resolve relative `to` paths.
*
* @returns A function that accepts `NavigateOptions`.
* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useNavigateHook
*/
export function useNavigate<
TRouter extends AnyRouter = RegisteredRouter,
TDefaultFrom extends string = string,
>(_defaultOpts?: {
from?: FromPathOption<TRouter, TDefaultFrom>
}): UseNavigateResult<TDefaultFrom> {
const router = useRouter()
return React.useCallback(
(options: NavigateOptions) => {
return router.navigate({
...options,
from: options.from ?? _defaultOpts?.from,
})
},
[_defaultOpts?.from, router],
) as UseNavigateResult<TDefaultFrom>
}
/**
* Component that triggers a navigation when rendered. Navigation executes
* in an effect after mount/update.
*
* Props are the same as `NavigateOptions` used by `navigate()`.
*
* @returns null
* @link https://tanstack.com/router/latest/docs/framework/react/api/router/navigateComponent
*/
export function Navigate<
TRouter extends AnyRouter = RegisteredRouter,
const TFrom extends string = string,
const TTo extends string | undefined = undefined,
const TMaskFrom extends string = TFrom,
const TMaskTo extends string = '',
>(props: NavigateOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): null {
const router = useRouter()
const navigate = useNavigate()
const previousPropsRef = React.useRef<NavigateOptions<
TRouter,
TFrom,
TTo,
TMaskFrom,
TMaskTo
> | null>(null)
useLayoutEffect(() => {
if (previousPropsRef.current !== props) {
navigate(props)
previousPropsRef.current = props
}
}, [router, props, navigate])
return null
}