iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
Modern Web

30天打造個人簡易旅遊網站系列 第 13

Day 13 :製作Navbar

  • 分享至 

  • xImage
  •  

今天我們要來實作如何在左側垂直導航欄中使用 NavLink 來切換不同的頁面,

1. 安裝 react-router-dom

延續昨天的內容,如果還沒安裝react-router-dom可以用以下指令安裝:
npm install react-router-dom

2. 建立頁面 (在 src/pages 資料夾下)

我目前有以下幾個頁面:

  • Home.jsx
  • Favorite.jsx(新增)
  • Place.jsx
  • Schedule.jsx(新增)

https://ithelp.ithome.com.tw/upload/images/20240926/20169447KTY2xIoUrE.png

3. 建立 Navbar 組件 (在 src/components 資料夾下)

創建一個 Navbar.jsx,並使用 NavLink 來做導航。
其中,NavLink就是從react-router-dom中導入的.

https://ithelp.ithome.com.tw/upload/images/20240926/20169447435EwvTssU.png

4. 設定 React Router

延續昨天的內容,在 src 資料夾下的 App.jsx,引入 BrowserRouterRoutesRoute 來設定路由。

https://ithelp.ithome.com.tw/upload/images/20240926/20169447vqaCG2KuXz.png

5. 調整組件

前幾天的範例,我們將Navbar的各個組件獨立成:

  • PlaceBar
  • FavoriteBar
  • ScheduleBar
    並放在Header內,現在,我們要調整一下:

https://ithelp.ithome.com.tw/upload/images/20240926/2016944726b9vxrk8b.png
原本PlaceBar、FavoriteBar以及ScheduleBar的排版我們都可以直接複製貼上到NavBar裡面,並且將原本的這些Bar組件刪掉或是註解掉


NavBar程式碼

import { NavLink } from "react-router-dom";
import styles from "./navbar.module.css";
import { EnvironmentFilled } from "@ant-design/icons";
import { HeartFilled } from "@ant-design/icons";
import { ScheduleFilled } from "@ant-design/icons";

export default function NavBar() {
  return (
    <div>
      <NavLink
        to="/"
        className={({ isActive }) =>
          isActive ? styles.navboxActive : styles.navbox
        }
      >
        <div className={styles.navItem}>
          <EnvironmentFilled style={{ fontSize: "24px", color: "bisque" }} />
          <h1 className={styles.title}>Site</h1>
        </div>
      </NavLink>
      <NavLink
        to="/favorite"
        className={({ isActive }) =>
          isActive ? styles.navboxActive : styles.navbox
        }
      >
        <div className={styles.navItem}>
          <HeartFilled style={{ fontSize: "24px", color: "bisque" }} />
          <h1 className={styles.title}>Favorite</h1>
        </div>
      </NavLink>
      <NavLink
        to="/schedule"
        className={({ isActive }) =>
          isActive ? styles.navboxActive : styles.navbox
        }
      >
        <div className={styles.navItem}>
          <ScheduleFilled style={{ fontSize: "24px", color: "bisque" }} />
          <h1 className={styles.title}>Schedule</h1>
        </div>
      </NavLink>
    </div>
  );
}

這段程式碼是使用 React Router 的 NavLink 元件來實現導航功能。當前導航項處於“活躍”狀態(即對應的路由與當前網址相匹配)時,會自動應用一個特定的樣式。這裡的重點在於 NavLinkclassName 屬性中使用 isActive 的方式。以下是詳細解釋:

1. NavLink 的作用

NavLinkreact-router-dom 提供的一個專門用於導航的組件,它的作用類似於 HTML 的 <a> 元素。與普通的 <Link> 不同的是,NavLink 可以根據當前路徑自動添加樣式或類名,表示這個鏈接當前是否處於“活躍(被點擊)”狀態。

2. isActive 的用法

NavLink 可以接受一個 classNamestyle 屬性,這個屬性可以是一個函數。這個函數接受一個包含 isActive 屬性的對象。isActive 是一個布林值,當 NavLink 對應的 to 路徑與當前的瀏覽器路徑匹配時,isActive 會返回 true,否則為 false

3. className 屬性中使用 isActive

在這段程式碼中,className 是一個函數,這個函數根據 isActive 的值來決定要使用的樣式類名:

className={({ isActive }) => isActive ? styles.navboxActive : styles.navbox }

  • ({ isActive }) => ... 是一個解構賦值,從 NavLink 傳遞的參數中取出 isActive
  • isActivetrue 時,styles.navboxActive 會被應用到 NavLink,代表這個鏈接是“活躍”的。
  • isActivefalse 時,styles.navbox 會被應用到 NavLink,表示這個鏈接不是“活躍”的。

4. 樣式變化示例

.navbox {
    display: flex;
    justify-content: flex-start;
    gap: 1rem;
    margin: 0.5rem 1rem;
  }
  
  /* 只對未處於 active 狀態的 navbox 應用 hover 樣式 */
  .navbox:not(.navboxActive):hover {
    background: rgba(188, 196, 249, 0.17);
    border-radius: 8px;
  }
  
  .title {
    font-size: larger;
    color: aliceblue;
  }
  
  /* active 狀態的 navbox 樣式 */
  .navboxActive {
    composes: navbox;
    background: rgba(172, 182, 244, 0.411);
    border-radius: 8px;
  }
  
  .navItem {
    display: flex;
    justify-content: flex-start;
    gap: 1rem;
    margin: 0.5rem 1rem;
  }

這樣一來:

  • / 路徑對應 NavLink 為活躍狀態(當前 URL 是 http://localhost:3000/ 時),它會應用 styles.navboxActive(背景色為藍色)。
  • /favorite 路徑對應的 NavLink 為活躍狀態(當前 URL 是 http://localhost:3000/favorite 時),它會應用 styles.navboxActive
  • 同理,當 /schedule 路徑對應 NavLink 為活躍狀態(當前 URL 是 http://localhost:3000/schedule 時),它會應用 styles.navboxActive

5. 總結

  • NavLink 用於導航,並且可以根據當前路徑設置活躍狀態的樣式。
  • isActive 是一個布林值,當路徑匹配時為 true,否則為 false
  • 使用 isActive 可以根據當前狀態動態設置 NavLink 的樣式。

這種方式非常適合製作導航欄,當前項目處於Active狀態時用不同樣式顯示。


上一篇
Day 12 -React Router基礎介紹
下一篇
Day 14:使用 React 實現可收合的導航欄(Navbar)功能
系列文
30天打造個人簡易旅遊網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言