Skip to content

RouterProvider

Context provider component that makes the router available to all child components.

Import

ts
import { RouterProvider } from '@argon-router/react';

Usage

tsx
import { RouterProvider } from '@argon-router/react';
import { router } from './router';

function App() {
  return (
    <RouterProvider router={router}>
      <YourApp />
    </RouterProvider>
  );
}

Props

router (required)

The router instance created with createRouter:

tsx
import { createRouter, createRoute } from '@argon-router/core';

const homeRoute = createRoute({ path: '/home' });
const router = createRouter({
  routes: [homeRoute],
});

function App() {
  return (
    <RouterProvider router={router}>
      <YourApp />
    </RouterProvider>
  );
}

children (optional)

React components to render:

tsx
<RouterProvider router={router}>
  <Layout>
    <RoutesView />
  </Layout>
</RouterProvider>

With Effector Scope

For SSR or testing, wrap with Effector's Provider:

tsx
import { fork, Provider } from 'effector-react';
import { RouterProvider } from '@argon-router/react';

function App() {
  const scope = fork();

  return (
    <Provider value={scope}>
      <RouterProvider router={router}>
        <YourApp />
      </RouterProvider>
    </Provider>
  );
}

Accessing Router

Once provided, use hooks to access the router:

tsx
import { useRouter } from '@argon-router/react';

function Navigation() {
  const router = useRouter();

  return (
    <button onClick={() => router.back()}>
      Go Back
    </button>
  );
}

Multiple Routers

You can use multiple routers in different parts of your app:

tsx
import { RouterProvider } from '@argon-router/react';

const mainRouter = createRouter({ routes: [homeRoute, aboutRoute] });
const adminRouter = createRouter({ routes: [dashboardRoute, usersRoute] });

function App() {
  return (
    <div>
      <RouterProvider router={mainRouter}>
        <MainApp />
      </RouterProvider>

      <RouterProvider router={adminRouter}>
        <AdminPanel />
      </RouterProvider>
    </div>
  );
}

Error Handling

Components that use router hooks will throw an error if used outside RouterProvider:

tsx
function Component() {
  // ❌ Error: Router not found. Add RouterProvider in app root
  const router = useRouter();
}

Always wrap your app with RouterProvider:

tsx
// ✅ Correct
<RouterProvider router={router}>
  <Component />
</RouterProvider>

Example: Complete Setup

tsx
import { createRoot } from 'react-dom/client';
import { allSettled, fork } from 'effector';
import { Provider } from 'effector-react';
import { createBrowserHistory } from 'history';
import { RouterProvider } from '@argon-router/react';
import { historyAdapter } from '@argon-router/core';
import { router } from './router';
import { App } from './app';

const root = createRoot(document.getElementById('root')!);

async function render() {
  const scope = fork();
  const history = createBrowserHistory();

  // Initialize router with history
  await allSettled(router.setHistory, {
    scope,
    params: historyAdapter(history),
  });

  root.render(
    <Provider value={scope}>
      <RouterProvider router={router}>
        <App />
      </RouterProvider>
    </Provider>
  );
}

render();

See Also

Released under the MIT License.