Fixing “BrowserRouter Context” Errors in React Router
A common mistake when using React Router is forgetting to wrap your application with <BrowserRouter>
(or other router components), which leads to errors when trying to use routing hooks like useNavigate
or components like <Link>
.
The Core Problem
// ❌ Wrong - missing router wrapper
import { Routes, Route } from 'react-router-dom';
function App() {
return (
<div>
<Routes>
<Route path="/" element={<Home />} />
</Routes>
</div>
);
}
Correct Solutions
1. Basic Wrapping Pattern
// ✅ Correct - wrap entire app
import { BrowserRouter, Routes, Route } from 'react-router-dom';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
);
}
2. Alternative Router Types
React Router provides several router types for different environments:
// For web browsers (recommended for most SPAs)
import { BrowserRouter } from 'react-router-dom';
// For static file servers
import { HashRouter } from 'react-router-dom';
// For testing and non-browser environments
import { MemoryRouter } from 'react-router-dom';
// For React Native
import { NativeRouter } from 'react-router-native';
Where to Place the Router
1. In Your Main Entry File (Recommended)
// src/index.js or main.jsx
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import App from './App';
ReactDOM.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>,
document.getElementById('root')
);
2. In Your App Component
// src/App.jsx
import { BrowserRouter, Routes, Route } from 'react-router-dom';
export default function App() {
return (
<BrowserRouter>
<div className="app">
<Header />
<Routes>
<Route path="/" element={<Home />} />
</Routes>
<Footer />
</div>
</BrowserRouter>
);
}
Common Mistakes to Avoid
1. Multiple Routers
// ❌ Wrong - don't nest routers
<BrowserRouter>
<BrowserRouter> {/* Never do this */}
<App />
</BrowserRouter>
</BrowserRouter>
2. Partial Wrapping
// ❌ Wrong - some routing components outside router
<BrowserRouter>
<Routes> {/* Good */}
<Route path="/" element={<Home />} />
</Routes>
</BrowserRouter>
<Link to="/about">About</Link> {/* Bad - outside router */}
Testing Your Setup
To verify your router is properly configured:
- Check if
<Link>
components render as<a>
tags - Verify URL changes when navigating
- Ensure
useNavigate()
works without errors - Confirm route matching works correctly
Troubleshooting
If you’re still having issues:
- Error: “useNavigate() may be used only in the context of a Router”
- Solution: Move all routing-related code inside
<BrowserRouter>
- Error: “useHref() requires a routing context”
- Solution: Ensure all
<Link>
components are within the router
- Routes not working:
- Verify you’re using React Router v6+
- Check your basename if deploying to a subdirectory
Remember that in React Router v6, the router context must wrap all components that use routing features. This single requirement solves most routing-related errors in React applications.