React Router 教學
React Router 是 React 應用程式中實現單頁導頁(SPA)的主流方案。它提供多種導頁方式,常見的有 <Link> 元件與 useNavigate() hook。本教學將介紹這兩者的基本用法、適用情境,並延伸補充幾個常見的進階使用方式。
Link 元件用法與情境
- 用於頁面靜態導覽(例如導覽列、列表)
- 不會刷新頁面,體驗流暢
- 適合用戶「主動點擊」時
範例:
<Link to="/about">關於我們</Link>
useNavigate 用法與情境
- 適用於「程式邏輯」觸發的導航(如 API 結果、事件回應、表單送出)
- 可主動控制跳轉時機
範例:
import { useNavigate } from "react-router-dom";
const navigate = useNavigate();
function handleLogin() {
// ...登入流程
navigate("/dashboard");
}
其他常見用法
1. NavLink 進階導覽高亮
<NavLink> 除了具備 <Link> 功能,還能根據目前路徑自動加上「active」樣式。
範例:
import { NavLink } from "react-router-dom";
<NavLink
to="/profile"
className={({ isActive }) => (isActive ? "active nav-link" : "nav-link")}
>
我的檔案
</NavLink>;
2. Navigate 元件自動重導
用於元件渲染時自動導頁(常見於權限控制、路由守衛)。
範例:
import { Navigate } from "react-router-dom";
function ProtectedRoute({ user }) {
if (!user) {
return <Navigate to="/login" replace />;
}
return <Dashboard />;
}
3. 跳轉時帶參數與狀態
- 可傳遞動態路徑參數
- 可利用 state 傳資料到新頁面
範例:
// 1. 動態路徑
<Link to={`/post/${post.id}`}>詳情</Link>;
// 2. 帶 state
navigate("/result", { state: { score: 100 } });
// 接收 state
const location = useLocation();
console.log(location.state.score);
4. 返回上一頁
useNavigate 可傳入負數代表返回歷史紀錄。
範例:
const navigate = useNavigate();
<button onClick={() => navigate(-1)}>返回上一頁</button>;
5. 阻擋未登入用戶導頁
常搭配 React Router 的路由守衛(Protected Route Pattern)。
範例:
function PrivateRoute({ children }) {
const { user } = useAuth();
return user ? children : <Navigate to="/login" />;
}
情境比較與選擇建議
| 用法 | 適用情境 | 範例 |
|---|---|---|
<Link> | 靜態導覽、超連結 | 主選單、列表 |
<NavLink> | 導覽列需自動高亮 | 側邊欄、Tab 導覽 |
useNavigate | 程式邏輯導頁、事件觸發 | 表單送出、API 回傳 |
<Navigate> | 條件式自動跳轉 | 權限判斷、登入狀態 |
更多實戰常用方法
6. 巢狀路由(Nested Routes)
可在父路由下定義子路由,實現多層頁面結構。
// App.js
<Routes>
<Route path="/dashboard" element={<DashboardLayout />}>
<Route path="profile" element={<Profile />} />
<Route path="settings" element={<Settings />} />
</Route>
</Routes>
7. 懶加載路由(Lazy Loading)
提升效能,僅在需要時載入頁面元件。
import { lazy, Suspense } from "react";
const About = lazy(() => import("./About"));
<Suspense fallback={<div>Loading...</div>}>
<Route path="/about" element={<About />} />
</Suspense>;
8. 404 Not Found 處理
捕捉未定義路由,顯示自訂 404 頁面。
<Routes>
{/* ...其他路由... */}
<Route path="*" element={<NotFound />} />
</Routes>
9. 路由參數驗證與預設值
可在元件內驗證參數,或給定預設值。
import { useParams } from "react-router-dom";
function Post() {
const { id = "default" } = useParams();
// 驗證 id 是否有效
}
10. URL 查詢參數(Query Params)操作
取得與設定網址查詢參數。
import { useSearchParams } from "react-router-dom";
const [searchParams, setSearchParams] = useSearchParams();
const page = searchParams.get("page");
setSearchParams({ page: 2 });
11. 路由動畫(Transition)
可搭配動畫函式庫(如 Framer Motion)實現頁面切換動畫。
import { motion } from "framer-motion";
function Page() {
return (
<motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }}>
內容
</motion.div>
);
}
這些技巧能讓你的 React Router 導頁更靈活、專業,適用於中大型專案與多元情境。