Skip to content

React Router "Matched leaf route at location does not have an element" Error

Problem

When using React Router, you may encounter the error: "Matched leaf route at location '/' does not have an element. This means it will render an <Outlet /> with a null value by default resulting in an 'empty' page."

This error typically occurs when migrating from React Router v5 to v6, where the API has significant changes. The most common cause is using the old component prop syntax instead of the new element prop.

WARNING

This error specifically relates to React Router v6+ and indicates that a route is missing a valid element to render at the specified path.

Solution

The primary solution involves updating your route syntax from the v5 format to the newer v6 syntax. Here's what needs to change:

1. Replace component with element

Instead of using the component prop:

jsx
// ❌ Old syntax (v5)
<Route path="/" component={Home} />

Use the element prop:

jsx
// ✅ New syntax (v6)
<Route path="/" element={<Home />} />

2. Use JSX elements, not component references

In v6, you must pass a JSX element rather than just the component reference:

jsx
// ❌ Incorrect
<Route path="/" element={Home} />

// ✅ Correct
<Route path="/" element={<Home />} />

3. Self-close your Route components

While not required, it's recommended to self-close Route components in v6:

jsx
// Works but verbose
<Route path="/" element={<Home />}></Route>

// More concise
<Route path="/" element={<Home />} />

Complete Working Example

Here's how your corrected App.js should look:

jsx
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Home from './pages/Home';

const App = () => {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<Home />} />
        {/* Additional routes */}
        <Route path="/about" element={<About />} />
      </Routes>
    </Router>
  );
}

export default App;

Additional Considerations

Empty Element for Placeholder Routes

In some cases, you might need a route that doesn't render any component but serves as an anchor point. You can use an empty element:

jsx
<Route path="/placeholder" element={null} />

Nested Routes Configuration

If you're working with nested routes, ensure that parent routes have an <Outlet /> component to render their child routes:

jsx
<Route path="/dashboard" element={<Dashboard />}>
  <Route path="stats" element={<Stats />} />
  <Route path="settings" element={<Settings />} />
</Route>

Check for Typos

Sometimes the error can be caused by simple typos, such as misspelling "element" as "elment" or "elemnt":

jsx
// ❌ Common typo
<Route path="/" elment={<Home />} />

// ✅ Correct spelling
<Route path="/" element={<Home />} />

Migration Tips

When upgrading from React Router v5 to v6, be aware of these additional changes:

  • The exact prop is no longer needed - all paths match exactly by default
  • The Switch component has been replaced with Routes
  • Relative paths and links work differently in v6

INFO

For complete migration details, refer to the official React Router v6 migration guide.

Conclusion

The "Matched leaf route does not have an element" error is almost always resolved by:

  1. Replacing component={Component} with element={<Component />}
  2. Ensuring proper JSX syntax for route elements
  3. Checking for any spelling errors in prop names

By updating your route syntax to match React Router v6 requirements, you'll eliminate this error and ensure your application routes work correctly.