〖網頁挑戰〗 What's the country

閱讀時間約 8 分鐘
What's the country

What's the country

又是 Frontend Mentor 的挑戰!
這次要寫一個網站,讓使用者可以查詢國家,並且顯示國旗、人口、首都、語言、幣別等資料。原始檔案提供了 JSON 檔,或是可以去串接 REST Countries API,動態取得並呈現各國的資料,基本上看我們要怎麼寫都可以。
在 Frontend Mentor 挑戰中有分五個等級: Newby、Junior、Intermediate、Advanced、Guru,這次的挑戰是..Advanced, 先醜哭乙次(?),我也太勇敢了吧!雖然我只能挑戰到這個等級,因為 Guru 就要花錢了(喂—)

這次挑戰內容:

  • 在首頁渲染所有國家的小卡片
  • 用名稱搜尋國家
  • 用州別篩選出國家
  • 點擊小卡片就能看見國家的詳細資料
  • 在詳細資料中點擊相鄰國家,即可跳到該國家的詳細資料
  • 切換黑夜模式

HTML + CSS 切版

這次的重點是串接 API,所以切版的部分我就不再贅述。

raw-image
<header>
<a>Where in the world?</a>
<button>Dark Mode</button>
</header>

上方是一個 header:
裡面放首頁連結<a>跟切換模式的<button>

<main>
<div>
<!-- search bar -->
<!-- filter box -->
</div>
<div>
<!-- countries card container -->
</div>
</main>

中間的 main:
放入搜尋和篩選工具
再來放入國家的小卡片們

最底下就是 footer,寫版權文字的地方。



串接 REST Countries API

首先進入 rest countries API 網站,閱讀一下文檔,才知道要怎麼串:

確認串接端點

文檔中都會寫可以從哪個端點取得什麼資料,對第一次串 API 的孩紙來說一定會毫無頭緒,不知道從何下手,,我的話會把端點路徑直接丟到網址列去看資料的結構,然後會得到讓人視力下降的頁面(?)

以上就是把空格縮排都刪除的 JSON 文字

以上就是把空格縮排都刪除的 JSON 文字

因為現在的資料以 JSON 的數據格式為主,這裡推薦用 Chrome 擴充功能 JSON Viewer Pro 可以直接把密密麻麻的 JSON 文字轉換成好閱讀的畫面:

綠色顧眼睛

綠色顧眼睛

這時候我們可以比對最初的設計畫面,一邊比對資料結構,才不會抓了資料下來,才發現跟自己要的不一樣(哭)

現在來回頭看一下挑戰內容,看哪些端點適合用來完成挑戰:

  • 在首頁渲染所有國家的小卡片

這邊就用所有資料的端點:https://restcountries.com/v3.1/all

  • 用名稱搜尋國家

用名稱取得資料:https://restcountries.com/v3.1/name/{name}
後方的 {name} 可以替換國家名稱,想找韓國就是 https://restcountries.com/v3.1/name/korea
只要名稱裡面有包含搜尋的文字,都會跳出資料,所以除了南韓也會找到北韓 :)

  • 用州別篩選出國家

用洲名取得資料:https://restcountries.com/v3.1/region/{region}

  • 在詳細資料中點擊相鄰國家,即可跳到該國家的詳細資料

從資料結構中可以知道,相鄰國家給的資料是國家代碼,所以我們要有一個端點是以國家代碼取得資料:https://restcountries.com/v3.1/alpha/{code}

接下來寫 JavaScript 吧。



JavaScript - 非同步請求

JS 是單線程程式語言,也就是一次執行一行程式碼,執行完成才會進入下一行,假設今天我開啟網頁時,這個網頁需要去向遠端伺服器請求資料,這時候單線程的 JS 就會等待資料回傳回來(執行完成),才執行下一行,使用者就必須在螢幕前等..一直等..繼續等..

想像起來有多浪費生命!

於是非同步請求就這樣產生啦,當 JS 遇到非同步程式碼,非同步程式碼會被放到執行環境中,並從 Stack 中脫離。當非同步程式碼執行完成時,會把要執行的 callback 放到 Callback Queue 中。最後等到 Stack 已經沒有需要執行的程式碼時,再去執行 Callback Queue 中的函式。

或是可以想像一下:
你是一個咖啡店店員,要做的事是點餐、收銀、沖咖啡,出杯,如果今天你必須完成這個循環才能為下一位客人點餐,整個產線就會堵塞,這就是同步程式碼,一切都靠你自己完成,一次只能做一件事。
但是今天你點完餐後,先去咖啡機按下沖煮咖啡,接下來沖咖啡的事就是機器的事,而你又可以繼續為下一個客人點餐,不僅會減少排隊時間,還可以同時煮很多人的咖啡,這就是非同步程式碼,你把需要花時間處理的事交給了咖啡機。

所以很多時候,我們都會依賴其他伺服器提供的資料,就必須使用非同步方法來請求資料。

fetch 獲取數據

fetch 是非同步方法,用在與其他 API 對接獲取數據時使用,返回一個 Promise。

使用 fetch 時,因為要等待回應,所以還沒有獲取任何數據,
為此建立一個容器 - Promise,用來放置未來回傳的結果。

現在常用 async-await 語法糖來包裝非同步程式碼,看起來比較好閱讀:

// 定義端點的 URL​
const BASE_URL = 'https://restcountries.com/v3.1'

// 將非同步函式包裝在裡面 開頭寫下關鍵字 async
const getAllCountries = async function () {
// ...
}

裡面包一層 try-catch 錯誤處理,抓取錯誤:

const BASE_URL = "https://restcountries.com/v3.1";

const getAllCountries = async function () {
//裡面包一層 try-catch
try {
// 正常執行程式碼
} catch (err) {
// 有錯誤時 在 console 列出錯誤​
console.error(err);
}
};

接著就把 fetch 方法寫進去:

const BASE_URL = "https://restcountries.com/v3.1";

const getAllCountries = async function () {
try {
const res = await fetch(`${BASE_URL}/all`);
// 用 await 關鍵字 等待資料回傳完成

if (!res.ok) throw new Error(`SOMETHING WENT WRONG! (${res.status})`);
// 如果沒有回傳成功 則丟出錯誤 讓 catch 可以接住並報錯

const data = await res.json();
// 用 await 關鍵字 解析回傳的資料

if (!data) throw new Error("DATA IS NOT FOUND!");
// 如果沒有資料 則丟出錯誤 讓 catch 可以接住並報錯

displayCountries(data);
// 將資料寫成 DOM 並且渲染
} catch (err) {
console.error(err);
}
};

其他端點的寫法也差不多,只是要綁在不同的事件監聽器上。


黑夜模式還沒有寫好,只要跳轉其他畫面,就會恢復原狀,所以這部分會進一步優化,只是要等我睡飽(躺平)


完成頁面 ▶ What's the country

Solution ▶ Frontend Mentor - What's the country

avatar-img
5會員
14內容數
本來是理科生,在被物理放棄之後成為了文科生,有時理性思考,偶爾卻會脫口出感性的字句;喜歡打字的聲音,以生活為靈感寫下過去、現在與未來。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
碎碎念 的其他內容
這次寫的是 Frontend Mentor 挑戰的太空旅遊介紹的網站,當初作了一個星期,首頁都沒辦法完成,那時候對 flexbox、grid 的樣式寫法超不熟,用 position 也是作的很落漆。直到最近才又重新嘗試寫了一次...
這次的 Frontend Mentor challenge 是新手村最後一個挑戰 ▶ Intro component with sign up form 網頁,使用 jQuery validation plugin。
開始接觸網頁開發後,發現自己缺乏實作經驗, 於是老師推了 Frontend Mentor challenge , 免費的通常是獨立頁面,花錢則是可以挑戰多頁式網站, 初學還沒學到 javascript 或 API 也沒關係, 新手也有提供 HTML/CSS 的練習。 很適合用來增加自己寫網頁的經驗,
這次寫的是 Frontend Mentor 挑戰的太空旅遊介紹的網站,當初作了一個星期,首頁都沒辦法完成,那時候對 flexbox、grid 的樣式寫法超不熟,用 position 也是作的很落漆。直到最近才又重新嘗試寫了一次...
這次的 Frontend Mentor challenge 是新手村最後一個挑戰 ▶ Intro component with sign up form 網頁,使用 jQuery validation plugin。
開始接觸網頁開發後,發現自己缺乏實作經驗, 於是老師推了 Frontend Mentor challenge , 免費的通常是獨立頁面,花錢則是可以挑戰多頁式網站, 初學還沒學到 javascript 或 API 也沒關係, 新手也有提供 HTML/CSS 的練習。 很適合用來增加自己寫網頁的經驗,
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
芭達雅的夜晚燈火輝煌,熱鬧非凡。李天明站在酒店大堂,環顧四周,尋找楊天美的身影。這是他們兩人繼上次任務後的再次碰面,心情不免有些期待和緊張。楊天美通知他,她即將到芭達雅進行一項秘密任務,抓捕一個軍火集團。巧合的是,李天明也正好被派到芭達雅,負責一家高級酒店的管理系統調整工作。 時間剛過七點
Thumbnail
我是小白,能創業嗎? 創業要很多錢嗎? 創業失敗怎麼辦? 我没有很完美不敢開始? 創業新手零經驗? 怕失敗、資金短缺、無法競争? 我們的大咖導師團隊將助你克服恐懼, 把握市場機會,走向成功創業之路! 活動時間:7/9(二)〜7/20(日) 每天晚上7:30~9:30 全網贏銷云創
Thumbnail
石頭手遊代儲網的專業服務 專業遊戲代儲團隊 石頭手遊代儲網擁有一支專業的遊戲代儲團隊,這些成員都是經驗豐富、技術優秀的遊戲玩家。 他們對各種遊戲的玩法和充值機制非常了解,能夠提供專業的遊戲代儲建議和服務。 安全可靠的交易保障 在石頭手遊代儲網,交易安全始終是首要考慮的問題。 平台採用了先進的
Thumbnail
最簡單、最易上手的賺錢網路副業!2023 年即將結束,如果你到現在還沒有任何副業,未免有點可惜!如果你還沒有在線上賺到你的第一個 1 美元,那麼現在就是開始的時候了。 如果這是你一直想做的事情,下文將討論 5 種非常容易啟動的副業,絕對可以在接下來的 7 天內賺到你的第一筆錢。
Thumbnail
最近有專案需求要在 Web 上進行一個掃描條碼辨識的動作,做了一些功課,有 Open Source 方案跟商業解決方案,整理起來分享給大家。
Thumbnail
在紀錄片《PO到死》,描繪了一個普通打工者因登山社群的影響,轉變成勇於挑戰並鼓舞他人的風雲人物。然而,隨著挑戰的失敗與壓力,似乎漸漸失衡了。我將分享對挑戰意義的反思,並如何擁抱恐懼和風險。
Thumbnail
台灣前十大熱門ETF排名,有七檔是債券型ETF,這可能跌破許多人的眼鏡,而每一檔能躍上檯面的債券ETF,都有他獨到之處。當然,最大的不一定是最好的,文末有《SK白話財經》主講人的偏好排序,幫助您了解如何依照自身現金流、收益率、配息率需求挑選。
Thumbnail
華爾街的投資大佬風格迥異,但每個人出人頭地的大師都有自己的獨門秘籍。有人張揚肆意能夠在逆市中創造一個個傲人的成績;有人低調內斂無論是在牛、熊市依然能夠屹立不倒,奠定自己在市場上的傳奇;也有人行事張揚,投資風格十分激進,卻能夠憑藉敏銳洞察力在市場中“狂壓”被“封神”
Thumbnail
亞洲最具影響力的傳播權威獎項《Campaign Asia》於2020年末公布亞太區具優秀品牌溝通力的最佳代理商,愛德曼公關榮獲「亞太地區年度最佳公關企業網」大獎(Asia-Pacific PR Network of the Year)!
Thumbnail
先前 SimplyBook.me 有介紹過如何利用 API 客製功能啟用,在 WordPress 加入 SimplyBook.me 預約外掛,而今天要介紹的是更簡單的方式,來幫助商家快速的在 WordPress 加入線上預約外掛! 在官網或 WordPress / Wix 加入預約外掛的好處是?
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
芭達雅的夜晚燈火輝煌,熱鬧非凡。李天明站在酒店大堂,環顧四周,尋找楊天美的身影。這是他們兩人繼上次任務後的再次碰面,心情不免有些期待和緊張。楊天美通知他,她即將到芭達雅進行一項秘密任務,抓捕一個軍火集團。巧合的是,李天明也正好被派到芭達雅,負責一家高級酒店的管理系統調整工作。 時間剛過七點
Thumbnail
我是小白,能創業嗎? 創業要很多錢嗎? 創業失敗怎麼辦? 我没有很完美不敢開始? 創業新手零經驗? 怕失敗、資金短缺、無法競争? 我們的大咖導師團隊將助你克服恐懼, 把握市場機會,走向成功創業之路! 活動時間:7/9(二)〜7/20(日) 每天晚上7:30~9:30 全網贏銷云創
Thumbnail
石頭手遊代儲網的專業服務 專業遊戲代儲團隊 石頭手遊代儲網擁有一支專業的遊戲代儲團隊,這些成員都是經驗豐富、技術優秀的遊戲玩家。 他們對各種遊戲的玩法和充值機制非常了解,能夠提供專業的遊戲代儲建議和服務。 安全可靠的交易保障 在石頭手遊代儲網,交易安全始終是首要考慮的問題。 平台採用了先進的
Thumbnail
最簡單、最易上手的賺錢網路副業!2023 年即將結束,如果你到現在還沒有任何副業,未免有點可惜!如果你還沒有在線上賺到你的第一個 1 美元,那麼現在就是開始的時候了。 如果這是你一直想做的事情,下文將討論 5 種非常容易啟動的副業,絕對可以在接下來的 7 天內賺到你的第一筆錢。
Thumbnail
最近有專案需求要在 Web 上進行一個掃描條碼辨識的動作,做了一些功課,有 Open Source 方案跟商業解決方案,整理起來分享給大家。
Thumbnail
在紀錄片《PO到死》,描繪了一個普通打工者因登山社群的影響,轉變成勇於挑戰並鼓舞他人的風雲人物。然而,隨著挑戰的失敗與壓力,似乎漸漸失衡了。我將分享對挑戰意義的反思,並如何擁抱恐懼和風險。
Thumbnail
台灣前十大熱門ETF排名,有七檔是債券型ETF,這可能跌破許多人的眼鏡,而每一檔能躍上檯面的債券ETF,都有他獨到之處。當然,最大的不一定是最好的,文末有《SK白話財經》主講人的偏好排序,幫助您了解如何依照自身現金流、收益率、配息率需求挑選。
Thumbnail
華爾街的投資大佬風格迥異,但每個人出人頭地的大師都有自己的獨門秘籍。有人張揚肆意能夠在逆市中創造一個個傲人的成績;有人低調內斂無論是在牛、熊市依然能夠屹立不倒,奠定自己在市場上的傳奇;也有人行事張揚,投資風格十分激進,卻能夠憑藉敏銳洞察力在市場中“狂壓”被“封神”
Thumbnail
亞洲最具影響力的傳播權威獎項《Campaign Asia》於2020年末公布亞太區具優秀品牌溝通力的最佳代理商,愛德曼公關榮獲「亞太地區年度最佳公關企業網」大獎(Asia-Pacific PR Network of the Year)!
Thumbnail
先前 SimplyBook.me 有介紹過如何利用 API 客製功能啟用,在 WordPress 加入 SimplyBook.me 預約外掛,而今天要介紹的是更簡單的方式,來幫助商家快速的在 WordPress 加入線上預約外掛! 在官網或 WordPress / Wix 加入預約外掛的好處是?