--- title: useNavigate --- # useNavigate [MODES: framework, data, declarative] ## Summary [Reference Documentation ↗](https://api.reactrouter.com/v7/functions/react_router.useNavigate.html) Returns a function that lets you navigate programmatically in the browser in response to user interactions or effects. It's often better to use [`redirect`](../utils/redirect) in [`action`](../../start/framework/route-module#action)/[`loader`](../../start/framework/route-module#loader) functions than this hook. The returned function signature is `navigate(to, options?)`/`navigate(delta)` where: * `to` can be a string path, a [`To`](https://api.reactrouter.com/v7/types/react_router.To.html) object, or a number (delta) * `options` contains options for modifying the navigation * These options work in all modes (Framework, Data, and Declarative): * `relative`: `"route"` or `"path"` to control relative routing logic * `replace`: Replace the current entry in the [`History`](https://developer.mozilla.org/en-US/docs/Web/API/History) stack * `state`: Optional [`history.state`](https://developer.mozilla.org/en-US/docs/Web/API/History/state) to include with the new [`Location`](https://api.reactrouter.com/v7/interfaces/react_router.Location.html) * These options only work in Framework and Data modes: * `flushSync`: Wrap the DOM updates in [`ReactDom.flushSync`](https://react.dev/reference/react-dom/flushSync) * `preventScrollReset`: Do not scroll back to the top of the page after navigation * `viewTransition`: Enable [`document.startViewTransition`](https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition) for this navigation ```tsx import { useNavigate } from "react-router"; function SomeComponent() { let navigate = useNavigate(); return ( ); } ``` ## Signature ```tsx function useNavigate(): NavigateFunction ``` ## Returns A navigate function for programmatic navigation ## Examples ### Navigate to another path ```tsx navigate("/some/route"); navigate("/some/route?search=param"); ``` ### Navigate with a [`To`](https://api.reactrouter.com/v7/types/react_router.To.html) object All properties are optional. ```tsx navigate({ pathname: "/some/route", search: "?search=param", hash: "#hash", state: { some: "state" }, }); ``` If you use `state`, that will be available on the [`Location`](https://api.reactrouter.com/v7/interfaces/react_router.Location.html) object on the next page. Access it with `useLocation().state` (see [`useLocation`](../hooks/useLocation)). ### Navigate back or forward in the history stack ```tsx // back // often used to close modals navigate(-1); // forward // often used in a multistep wizard workflows navigate(1); ``` Be cautious with `navigate(number)`. If your application can load up to a route that has a button that tries to navigate forward/back, there may not be a `[`History`](https://developer.mozilla.org/en-US/docs/Web/API/History) entry to go back or forward to, or it can go somewhere you don't expect (like a different domain). Only use this if you're sure they will have an entry in the [`History`](https://developer.mozilla.org/en-US/docs/Web/API/History) stack to navigate to. ### Replace the current entry in the history stack This will remove the current entry in the [`History`](https://developer.mozilla.org/en-US/docs/Web/API/History) stack, replacing it with a new one, similar to a server side redirect. ```tsx navigate("/some/route", { replace: true }); ``` ### Prevent Scroll Reset [MODES: framework, data]

To prevent [``](../components/ScrollRestoration) from resetting the scroll position, use the `preventScrollReset` option. ```tsx navigate("?some-tab=1", { preventScrollReset: true }); ``` For example, if you have a tab interface connected to search params in the middle of a page, and you don't want it to scroll to the top when a tab is clicked. ### Return Type Augmentation Internally, `useNavigate` uses a separate implementation when you are in Declarative mode versus Data/Framework mode - the primary difference being that the latter is able to return a stable reference that does not change identity across navigations. The implementation in Data/Framework mode also returns a [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) that resolves when the navigation is completed. This means the return type of `useNavigate` is `void | Promise`. This is accurate, but can lead to some red squigglies based on the union in the return value: - If you're using `typescript-eslint`, you may see errors from [`@typescript-eslint/no-floating-promises`](https://typescript-eslint.io/rules/no-floating-promises) - In Framework/Data mode, `React.use(navigate())` will show a false-positive `Argument of type 'void | Promise' is not assignable to parameter of type 'Usable'` error The easiest way to work around these issues is to augment the type based on the router you're using: ```ts // If using declare module "react-router" { interface NavigateFunction { (to: To, options?: NavigateOptions): void; (delta: number): void; } } // If using or Framework mode declare module "react-router" { interface NavigateFunction { (to: To, options?: NavigateOptions): Promise; (delta: number): Promise; } } ```