React
SPA
React Router
API
useParams
本篇為 [FE302] React 基礎 - hooks 版本 這門課程的學習筆記。如有錯誤歡迎指正!
之前實作的留言板只有單一頁面,但隨著專案規模越大,需要藉由路由來渲染不同頁面時,就需要路由進行配置與管理,而 react-router-dom 套件就有提供這個功能。
接下來我們使用 React 搭配 Router,實作一個 SPA(Single Page Application)架構的部落格。
可參考官方文件,我們可透過 React Router 套件來管理 URL 路由。
React Router 同樣是要用寫 React 方式去理解,也就是以 Component 的概念去設計一個 Router。
這其實和我們之前寫 Back-End 時很不一樣,例如 app.get('/comment')
,代表讀取留言的路由。
可參考官方提供的範例:
以下是上方範例的程式碼,透過連結改變的網址,由 Router 決定要 render 的畫面:
而在引入 Router 時,其實有兩種方式:
如果是從首頁點選 dashboard,前端就會透過 JavaScript 提供的 API 把網址改成 /dashboard,能夠正常 render 畫面。
但如果是直接在網址後帶上 /dashboard,GitHub Pages 會去找 dashboard 資料夾底下的 index.html,此時瀏覽器會直接發 request 到該頁面,發生不如預期的錯誤。
/#/
,瀏覽器就會去載入 #
符號之前的網址,即可改善上述問題有了以上關於 Router 的基本概念後,就來繼續實作專案吧!
以建立 HomePage Component 為例,Header 和 LoginPage 也是用這個模式:
而為了調整專案結構,需在 index.js 引入並引出 HomePage.js,可參考上篇筆記:
執行結果如下,可透過不同路由 render 相對應的頁面,其中 Header 是共同區塊不會變動:
參考資料:
瞭解到如何管理路由之後,再來就是透過 component 切出想要的畫面。
首先進行 Header component 導覽列連結的部分。
程式碼如下:
除了使用 useLocation 來判斷當前路徑,React Router 還有提供 NavLink 這個特殊的 Component,具有以下屬性:
參考資料:
可透過 activeClassName 屬性或 inline style 行內樣式,來表示 NavLink 有無被選取,官方提供的範例如下:
但在實際應用的時候,有遇到個問題,就是如果想搭配 style-component 使用,會不知該如何傳入 activeClassName 這個 props!
針對如何在 NavLink 組件中使用 activeClassName 屬性,參考一些網路上的範例進行改寫,以下示範兩種作法:
可參考下方範例:
其他參考資料:
測試用的 API 同樣參考:Lidemy 學生專用 API Server,部落格要串接的是 Posts API,資料結構如下:
URL:https://student-json-api.lidemy.me/posts?userId=1
通常會在 src 路徑底下,新增一個 WebAPI.js 專門用來管理串連 API 相關程式碼。
如下方程式碼,使用 fetch 串接 API 再進行資料處理:
在文章列表頁面,我們希望能夠顯示文章標題(title)和時間(createdAt)這兩個資訊:
結果如下:
接著是單一文章頁面,當我們在 Router 使用動態參數來讀取個別資料時,會需要取得 URL 上的 id 值。
在 WebAPI.js 中,根據路由上不同 id 來拿取相對應的 post:
透過 react-router 提供的 Hooks:useParams 就能更方便取得 id 值,而不需再透過 props.match.params
抓取 URL 路由的參數值。
以下是官方文件提供的範例,這裡指定的值就是 {slug}
:
新增 PostPage 和 NewPostPage 的路由,並在 src\pages 資料夾建立 pages component 引入使用:
稍微整理專案結構,在 src\pages
建立 index.js 來統一處理 pages 的引入引出動作:
post &&
確認陣列裡面有東西才會執行,以 post.title
為例:結果如下:
到這邊我們已經完成專案基本架構,設定路由,以及顯示全部文章、顯示單篇文章的功能,下一篇要繼續學習如何在 React 實作登入機制。