# File-Based Routing

## File-Based Routing&#x20;

<figure><img src="/files/qx3j6rcxNYlJUKXZhSro" alt="" width="375"><figcaption></figcaption></figure>

### 1. Understanding the File-Based Routing Concept

* **File-Based Routing Overview:**\
  In Next.js (using the new <mark style="color:purple;">**app**</mark> folder), every folder and file corresponds to a route. Instead of manually configuring routes (as in traditional single page applications), you simply create folders and files:
  * A folder inside `app/` represents a route segment.
  * A file named <mark style="color:orange;">`page.js`</mark> (or `page.jsx`) inside a folder renders the content for that route.
* **Routing Benefits:**
  * **No need for extra libraries:** You don’t need React Router or similar tools.
  * **Intuitive and Scalable:** Adding nested or dynamic routes is as simple as creating subfolders.

```jsx
// app/layout.jsx

export const metadata = {
  title: "Create Next App",
  description: "Generated by create next app",
};

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>
        {children}
      </body>
    </html>
  );
}
```

***

### 2. Creating Basic Routes

#### a. Home Page Route

1. **Navigate to your project’s root folder** (e.g., open **property-shop-next-app** in your code editor).
2. **Inside the `app/` folder, create a file named&#x20;**<mark style="color:orange;">**`page.jsx`**</mark> if it isn’t already present.
   * This file represents your home route (`/`).
   * Add a simple component:

     ```jsx
     export default function HomePage() {
       return (
         <div>
           <h1>Welcome to Property Shop</h1>
           <p>This is the home page.</p>
         </div>
       );
     }
     ```

#### b. Creating a New Route (e.g., `/properties`)

1. **Inside the&#x20;**<mark style="color:purple;">**`app`**</mark>**`/` folder, create a new folder called&#x20;**<mark style="color:purple;">**`properties`**</mark>**.**
2. **Within the `properties` folder, create a file named&#x20;**<mark style="color:orange;">**`page.jsx`**</mark>**.**
   * This file will render when you visit `/properties`.
   * Example component:

     ```jsx
     export default function PropertiesPage() {
       return (
         <div>
           <h1 className='text-3xl' >Properties</h1>
           <Link href='/properties'> List of properties will appear here.</Link>
         </div>
       );
     }
     ```

***

### 3. Building Nested Routes

#### a. Nested Route for Adding a Property (<mark style="color:purple;">`/properties/add`</mark>)

1. **Inside the&#x20;**<mark style="color:purple;">**`properties`**</mark>**&#x20;folder, create a subfolder named&#x20;**<mark style="color:purple;">**`add`**</mark>**.**
2. **Within the `add` folder, create a file called&#x20;**<mark style="color:orange;">**`page.jsx`**</mark>**.**
   * This page renders at the route <mark style="color:purple;">`/properties/add`</mark>.
   * Example:

     ```jsx
     export default function PropertyAddPage() {
       return (
         <div>
           <h1>Add a New Property</h1>
           <p>Form to add a new property will go here.</p>
         </div>
       );
     }
     ```

***

### 4. Implementing Dynamic Routes-\[slug] or \[id]

#### a. Creating a Dynamic Route for a Single Property (<mark style="color:purple;">`/properties/[id]`</mark>)

1. **Inside the `properties` folder, create a folder for the dynamic segment.**
   * **Name it&#x20;**<mark style="color:purple;">**`[id]`**</mark> (using square brackets tells Next.js that this part is dynamic).
2. **Within the `[id]` folder, create a file named&#x20;**<mark style="color:orange;">**`page.jsx`**</mark>**.**
   * This file will handle any route matching <mark style="color:purple;">`/properties/some-id`</mark>.
   * Example component:

     ```jsx
     //app/properties/[id]/page.jsx
     'use client'
     import { useParams } from 'next/navigation';

     export default function PropertyPage() {
       const params = useParams();
       const { id } = params;

       return (
         <div>
           <h1>Property Details</h1>
           <p>Displaying details for property ID: {id}</p>
         </div>
       );
     }
     ```

#### b. (Optional) Creating a Catch-All Route

* **Purpose:** To capture additional sub-paths beyond the dynamic parameter.
* **Implementation:** Rename the folder from `[id]` to `[...id]`.
  * This allows any route matching `/properties/anything/here` to be handled by the same component.
* **Note:** Use catch-all routes only when you need to handle nested dynamic segments.

***

### 5. Navigating Between Routes

#### a. Using the Next.js `<Link>` Component

1. **Import Link from `next/link`:**

   ```jsx
   import Link from 'next/link';
   ```
2. **Replace traditional `<a>` tags with `<Link>` for client-side navigation:**
   * Example in your home page:

     ```jsx
     import Link from 'next/link'
     export default function HomePage() {
       return (
         <div>
           <h1>Welcome to Property Shop</h1>
           <p>Click below to view properties:</p>
           <Link href="/properties">
             Show Properties
           </Link>
         </div>
       );
     }
     ```
3. **Benefit:** Using `<Link>` improves performance by preventing full page reloads and enabling smooth client-side transitions.

***

### 6. Recap and Best Practices

* **File-Based Routing:**
  * Every folder in the `app/` directory corresponds to a URL segment.
  * Naming a file `page.jsx` automatically makes it a routable page.
* **Nested and Dynamic Routes:**
  * Create nested folders to represent sub-routes (e.g., `/properties/add`).
  * Use square brackets (e.g., `[id]`) for dynamic parameters.
  * Optionally, use `[...id]` for catch-all dynamic routes.
* **Client-Side Navigation:**
  * Always use the `<Link>` component from Next.js for smoother navigation between pages.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://reactjs.koida.tech/backend-frameworks-next.js/hands-on-practice-2/file-based-routing.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
