---
title: RouterProvider
---
# RouterProvider
[MODES: data]
## Summary
[Reference Documentation ↗](https://api.reactrouter.com/v7/functions/react_router.RouterProvider.html)
Render the UI for the given [`DataRouter`](https://api.reactrouter.com/v7/interfaces/react_router.DataRouter.html). This component should
typically be at the top of an app's element tree.
```tsx
import { createBrowserRouter } from "react-router";
import { RouterProvider } from "react-router/dom";
import { createRoot } from "react-dom/client";
const router = createBrowserRouter(routes);
createRoot(document.getElementById("root")).render(
);
```
Please note that this component is exported both from
`react-router` and `react-router/dom` with the only difference being that the
latter automatically wires up `react-dom`'s [`flushSync`](https://react.dev/reference/react-dom/flushSync)
implementation. You _almost always_ want to use the version from
`react-router/dom` unless you're running in a non-DOM environment.
## Signature
```tsx
function RouterProvider({
router,
flushSync: reactDomFlushSyncImpl,
onError,
unstable_useTransitions,
}: RouterProviderProps): React.ReactElement
```
## Props
### flushSync
The [`ReactDOM.flushSync`](https://react.dev/reference/react-dom/flushSync)
implementation to use for flushing updates.
You usually don't have to worry about this:
- The `RouterProvider` exported from `react-router/dom` handles this internally for you
- If you are rendering in a non-DOM environment, you can import
`RouterProvider` from `react-router` and ignore this prop
### onError
An error handler function that will be called for any middleware, loader, action,
or render errors that are encountered in your application. This is useful for
logging or reporting errors instead of in the `ErrorBoundary` because it's not
subject to re-rendering and will only run one time per error.
The `errorInfo` parameter is passed along from
[`componentDidCatch`](https://react.dev/reference/react/Component#componentdidcatch)
and is only present for render errors.
```tsx
{
let { location, params, unstable_pattern, errorInfo } = info;
console.error(error, location, errorInfo);
reportToErrorService(error, location, errorInfo);
}} />
```
### router
The [`DataRouter`](https://api.reactrouter.com/v7/interfaces/react_router.DataRouter.html) instance to use for navigation and data fetching.
### unstable_useTransitions
Control whether router state updates are internally wrapped in
[`React.startTransition`](https://react.dev/reference/react/startTransition).
- When left `undefined`, all state updates are wrapped in
`React.startTransition`
- This can lead to buggy behaviors if you are wrapping your own
navigations/fetchers in `startTransition`.
- When set to `true`, [`Link`](../components/Link) and [`Form`](../components/Form) navigations will be wrapped
in `React.startTransition` and router state changes will be wrapped in
`React.startTransition` and also sent through
[`useOptimistic`](https://react.dev/reference/react/useOptimistic) to
surface mid-navigation router state changes to the UI.
- When set to `false`, the router will not leverage `React.startTransition` or
`React.useOptimistic` on any navigations or state changes.
For more information, please see the [docs](https://reactrouter.com/explanation/react-transitions).