Skip to content

Instantly share code, notes, and snippets.

@flicardie
Created September 12, 2022 01:58
Show Gist options
  • Save flicardie/59dab92bc224327bbde3afa091875b73 to your computer and use it in GitHub Desktop.
Save flicardie/59dab92bc224327bbde3afa091875b73 to your computer and use it in GitHub Desktop.
Nested Routes - React Router v5 #NestedRoutes #ReactJs #ReactRouter

Ejemplo de Nested Routes

https://ui.dev/react-router-nested-routes

import * as React from "react";
import {
  BrowserRouter as Router,
  Link,
  Route,
  useParams,
  Routes,
  Outlet
} from "react-router-dom";
import { getTopic, getResource, getTopics } from "./api";

function Home() {
  return (
    <React.Fragment>
      <h1>Home</h1>
      <p>
        Welcome to our content index. Head over to{" "}
        <Link to="/topics">/topics</Link> to see our catalog.
      </p>
    </React.Fragment>
  );
}

function Resource() {
  const { topicId, resourceId } = useParams();

  const { name, description, id } = getResource({ topicId, resourceId });

  return (
    <div>
      <h3>{name}</h3>
      <p>{description}</p>
      <a href={`https://ui.dev/${id}`}>Read Post</a>
    </div>
  );
}

function Topic() {
  const { topicId } = useParams();
  const topic = getTopic(topicId);

  return (
    <div>
      <h2>{topic.name}</h2>
      <p>{topic.description}</p>

      <ul>
        {topic.resources.map((sub) => (
          <li key={sub.id}>
            <Link to={sub.id}>{sub.name}</Link>
          </li>
        ))}
      </ul>

      <hr />

      <Outlet />
    </div>
  );
}

function Topics() {
  const topics = getTopics();

  return (
    <div>
      <h1>Topics</h1>
      <ul>
        {topics.map(({ name, id }) => (
          <li key={id}>
            <Link to={id}>{name}</Link>
          </li>
        ))}
      </ul>

      <hr />

      <Outlet />
    </div>
  );
}

export default function App() {
  return (
    <Router>
      <div>
        <ul>
          <li>
            <Link to="/">Home</Link>
          </li>
          <li>
            <Link to="/topics">Topics</Link>
          </li>
        </ul>

        <hr />

        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/topics" element={<Topics />}>
            <Route path=":topicId" element={<Topic />}>
              <Route path=":resourceId" element={<Resource />} />
            </Route>
          </Route>
        </Routes>
      </div>
    </Router>
  );
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment