今天我們要來實作如何在左側垂直導航欄中使用 NavLink 來切換不同的頁面,
延續昨天的內容,如果還沒安裝react-router-dom可以用以下指令安裝:npm install react-router-dom
src/pages 資料夾下)我目前有以下幾個頁面:
Home.jsx
Favorite.jsx(新增)Place.jsx
Schedule.jsx(新增)
src/components 資料夾下)創建一個 Navbar.jsx,並使用 NavLink 來做導航。
其中,NavLink就是從react-router-dom中導入的.

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

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

原本PlaceBar、FavoriteBar以及ScheduleBar的排版我們都可以直接複製貼上到NavBar裡面,並且將原本的這些Bar組件刪掉或是註解掉
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 元件來實現導航功能。當前導航項處於“活躍”狀態(即對應的路由與當前網址相匹配)時,會自動應用一個特定的樣式。這裡的重點在於 NavLink 的 className 屬性中使用 isActive 的方式。以下是詳細解釋:
NavLink 的作用NavLink 是 react-router-dom 提供的一個專門用於導航的組件,它的作用類似於 HTML 的 <a> 元素。與普通的 <Link> 不同的是,NavLink 可以根據當前路徑自動添加樣式或類名,表示這個鏈接當前是否處於“活躍(被點擊)”狀態。
isActive 的用法NavLink 可以接受一個 className 或 style 屬性,這個屬性可以是一個函數。這個函數接受一個包含 isActive 屬性的對象。isActive 是一個布林值,當 NavLink 對應的 to 路徑與當前的瀏覽器路徑匹配時,isActive 會返回 true,否則為 false。
className 屬性中使用 isActive在這段程式碼中,className 是一個函數,這個函數根據 isActive 的值來決定要使用的樣式類名:
className={({ isActive }) => isActive ? styles.navboxActive : styles.navbox }
({ isActive }) => ... 是一個解構賦值,從 NavLink 傳遞的參數中取出 isActive。isActive 為 true 時,styles.navboxActive 會被應用到 NavLink,代表這個鏈接是“活躍”的。isActive 為 false 時,styles.navbox 會被應用到 NavLink,表示這個鏈接不是“活躍”的。.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。NavLink 用於導航,並且可以根據當前路徑設置活躍狀態的樣式。isActive 是一個布林值,當路徑匹配時為 true,否則為 false。isActive 可以根據當前狀態動態設置 NavLink 的樣式。這種方式非常適合製作導航欄,當前項目處於Active狀態時用不同樣式顯示。