React Router 是一個用來處理單頁應用程式(Single Page Application, SPA)中的路由管理的工具。通過它,我們可以輕鬆地在不同的頁面之間切換,並保持 SPA 的無刷新體驗。
如果你只是簡單地使用 <a>
標籤或 window.location.href
來改變 URL,這是傳統的多頁應用方式,會導致整個頁面的刷新。
若不使用Router來實現 SPA(單頁應用)會變得麻煩:你需要手動管理瀏覽器的 URL、歷史紀錄、以及不同頁面之間的狀態同步。
React Router 的 <Link>
組件實際上是利用了瀏覽器的 history.pushState
來實現無刷新頁面導航。當你點擊 <Link>
時,React Router 只會更新瀏覽器的地址欄,而不會發送新的 HTTP 請求,這樣就保持了頁面的狀態,達到了 SPA 的效果。
history.pushState
是 HTML5 提供的一個 API,用來手動改變瀏覽器的 URL,而不會重新加載整個頁面。<Link>
實際上就是對 history.pushState
的封裝,並告訴 React Router 根據新路徑渲染對應的頁面組件。如果你不用 React Router 的 <Link>
,而使用 <a>
或手動修改 window.location
,就像傳統的多頁應用那樣,這樣會導致:
React Router 主要提供三個核心組件來管理路由:
首先,我們需要在 React 應用中安裝 React Router。npm install react-router-dom
然後配置三個檔案來測測
src
|
|--SubHome.jsx
|--App1.jsx
|--App2.jsx
|--index.js
額不知道為啥我這取Home會有名子衝突,如果你的不會取Home也行。
前面三個測試檔就簡單寫
// SubHome.jsx
import React from 'react';
function SubHome() {
return (
<div>
<h2>這是首頁</h2>
</div>
);
}
export default SubHome;
接下來是比較重要的index.js
import React from 'react';
import ReactDOM from 'react-dom/client'; // 改成從 'react-dom/client' 匯入
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
import SubHome from './SubHome';
import App1 from './App1';
import App2 from './App2';
function App() {
return (
<Router>
<div>
{/* 定義導航欄 */}
<nav>
<ul>
<li>
<Link to="/">首頁</Link>
</li>
<li>
<Link to="/app1">App1</Link>
</li>
<li>
<Link to="/app2">App2</Link>
</li>
</ul>
</nav>
{/* 定義路由 */}
<Routes>
<Route path="/" element={<SubHome />} />
<Route path="/app1" element={<App1 />} />
<Route path="/app2" element={<App2 />} />
</Routes>
</div>
</Router>
);
}
const rootElement = document.getElementById('root');
const root = ReactDOM.createRoot(rootElement);
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
這樣,透過 <Link>
改變 URL 並通知 React Router 根據新路徑渲染對應的頁面,就可以實現單頁應用(SPA)無刷新頁面切換的效果。
今天就到這囉,謝謝