EP30 - ex2. Fetching data

更新於 2024/10/07閱讀時間約 9 分鐘
fetching data 應該是跟後端API串接的範例嗎?
這個範例應該很重要!要好好練習~
這個範例從 GitHub 的 API 抓取最新的 Vue.js 提交數據並顯示為一個列表。您可以在兩個分支之間切換。

<script setup> 部分

<script setup>
import { ref, watchEffect } from 'vue'

// 定義 API URL 常數
const API_URL = `https://api.github.com/repos/vuejs/core/commits?per_page=3&sha=`

// 定義可選分支
const branches = ['main', 'v2-compat']

// 設定當前選擇的分支,預設為 'main'
const currentBranch = ref(branches[0])

// 設定提交記錄的狀態
const commits = ref([])

// 監聽 currentBranch 的變化,並抓取對應分支的提交記錄
watchEffect(async () => {
// 這個副作用會立即執行,並在 currentBranch.value 改變時重新執行
const url = `${API_URL}${currentBranch.value}`
// 抓取 API 數據並解析為 JSON,存入 commits
commits.value = await (await fetch(url)).json()
})

// 截斷長訊息只顯示第一行
function truncate(v) {
const newline = v.indexOf('\n')
return newline > 0 ? v.slice(0, newline) : v
}

// 格式化日期,將 'T' 和 'Z' 替換成空格
function formatDate(v) {
return v.replace(/T|Z/g, ' ')
}
</script>

<template> 部分

<template>
<!-- 標題 -->
<h1>Latest Vue Core Commits</h1>

<!-- 分支切換按鈕 -->
<template v-for="branch in branches">
<input type="radio"
:id="branch"
:value="branch"
name="branch"
v-model="currentBranch">
<label :for="branch">{{ branch }}</label>
</template>

<!-- 當前分支名稱 -->
<p>vuejs/vue@{{ currentBranch }}</p>

<!-- 提交記錄列表 -->
<ul v-if="commits.length > 0">
<li v-for="{ html_url, sha, author, commit } in commits" :key="sha">
<a :href="html_url" target="_blank" class="commit">{{ sha.slice(0, 7) }}</a>
- <span class="message">{{ truncate(commit.message) }}</span><br>
by <span class="author">
<a :href="author.html_url" target="_blank">{{ commit.author.name }}</a>
</span>
at <span class="date">{{ formatDate(commit.author.date) }}</span>
</li>
</ul>
</template>

<style> 部分

<style>
a {
text-decoration: none;
color: #42b883;
}
li {
line-height: 1.5em;
margin-bottom: 20px;
}
.author,
.date {
font-weight: bold;
}
</style>

當這段 Vue.js 代碼運行時,它會自動從 GitHub 的 API 抓取最新的 Vue.js 提交數據並顯示在網頁上。以下是這段代碼的處理邏輯:

  1. 引入 Vue.js 的 Composition API 函數
    • ref 用於創建響應式變數。
    • watchEffect 用於監聽變數的變化,並在變化時執行相關邏輯。
  2. 設置 API URL 和分支
    • API_URL 定義了 GitHub API 的基礎 URL,將用於請求提交數據。
    • branches 定義了一個包含可選擇分支的數組,包括 'main''v2-compat'
  3. 定義響應式變數
    • currentBranch 是一個響應式變數,用來存儲當前選擇的分支。初始化為 branches 的第一個元素,即 'main'
    • commits 是一個響應式變數,用來存儲從 API 獲取的提交數據,初始化為空數組。
  4. 使用 watchEffect 監聽 currentBranch 的變化
    • currentBranch 的值改變時,watchEffect 中的回調函數會自動執行。
    • 回調函數會構建請求的 URL,然後使用 fetch 從 GitHub API 獲取最新的提交數據。
    • 獲取到的數據會解析為 JSON 格式,並存儲到 commits 中。
  5. 定義輔助函數
    • truncate 用來截斷提交訊息,只顯示第一行。
    • formatDate 用來格式化日期,將 'T' 和 'Z' 替換為空格,使日期顯示更友好。
  6. 模板部分
    • 顯示標題 "Latest Vue Core Commits"。
    • 使用 v-for 迴圈渲染分支切換按鈕,每個按鈕綁定一個分支,並通過 v-model 綁定到 currentBranch
    • 顯示當前選擇的分支名稱。
    • 如果 commits 有數據,使用 v-for 迴圈顯示提交記錄。每條記錄包括提交的連結、截斷後的提交訊息、作者的名稱及其 GitHub 頁面連結、和格式化後的提交日期。
  7. 樣式部分
    • 設定連結的樣式,使其顏色為 Vue.js 主題顏色。
    • 設定列表項的行高和下邊距。
    • 設定作者和日期的字體加粗。

資料處理流程總結

  1. 初始化狀態:設定 API URL 和可選分支,並初始化響應式變數 currentBranchcommits
  2. 監聽變化:使用 watchEffect 監聽 currentBranch 的變化,一旦變化,重新抓取對應分支的提交數據。
  3. 抓取數據:當 currentBranch 改變時,構建請求 URL,使用 fetch 從 GitHub API 獲取提交數據,並解析為 JSON 存儲到 commits 中。
  4. 顯示數據:在模板中動態顯示當前選擇的分支和提交記錄,並使用輔助函數處理訊息和日期顯示。

這樣,整個應用就能夠自動更新並顯示最新的提交數據,並允許用戶在不同的分支之間切換。

raw-image
raw-image
以前都不知道原來github可以用API把原始碼撈出來~
這些資訊可以去這邊查看 https://docs.github.com/en/rest
以後可以對開源項目的活躍度跟版本追蹤~做做統計數據~
avatar-img
2會員
71內容數
分享生活趣事~
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
卡關的人生 的其他內容
看官方文件好累,終於要來看實用範例摟!這篇要做一個Markdown編輯器,真的假的?!
使用 defineAsyncComponent 函數可實現此功能,它接受一個返回 Promise 的加載函數。在大型應用中,組件可以按需加載,並且可與 ES 模塊的動態導入結合使用。還可以使用高級選項處理加載和錯誤狀態,例如設置加載組件和超時設定。
在 Vue 中,當需要將數據從父組件傳遞到深層嵌套的子組件時,使用 props 會導致屬性過度傳遞 (Prop Drilling),這樣即使某些中間組件不需要這些數據,也必須聲明並傳遞它們。這種情況會使代碼難以維護。Provide 和 Inject 是解決這個問題的工具。
通過使用插槽,組件可以變得更加靈活和可重用,例如 <FancyButton> 可以讓父組件提供按鈕的內部內容,而 <BaseLayout> 則可以使用命名插槽來指定不同區域的內容。插槽還可以設置預設內容,當父組件未提供插槽內容時,會渲染預設內容。
當組件渲染單根元素時,這些屬性會自動添加到根元素中。如果子組件的根元素已有class或style屬性,則會與從父組件繼承的屬性合併。v-on事件監聽器也遵循相同規則。當組件嵌套時,降級屬性會自動轉發給子組件。
從 3.4 開始,推薦使用 defineModel() 巨集來自動化這個過程,讓寫法更加簡潔,支持多個 v-model 綁定,並可直接使用自定義修飾符。新方法還能同步父子組件的值,減少同步問題,使組件的開發與維護變得更方便
看官方文件好累,終於要來看實用範例摟!這篇要做一個Markdown編輯器,真的假的?!
使用 defineAsyncComponent 函數可實現此功能,它接受一個返回 Promise 的加載函數。在大型應用中,組件可以按需加載,並且可與 ES 模塊的動態導入結合使用。還可以使用高級選項處理加載和錯誤狀態,例如設置加載組件和超時設定。
在 Vue 中,當需要將數據從父組件傳遞到深層嵌套的子組件時,使用 props 會導致屬性過度傳遞 (Prop Drilling),這樣即使某些中間組件不需要這些數據,也必須聲明並傳遞它們。這種情況會使代碼難以維護。Provide 和 Inject 是解決這個問題的工具。
通過使用插槽,組件可以變得更加靈活和可重用,例如 <FancyButton> 可以讓父組件提供按鈕的內部內容,而 <BaseLayout> 則可以使用命名插槽來指定不同區域的內容。插槽還可以設置預設內容,當父組件未提供插槽內容時,會渲染預設內容。
當組件渲染單根元素時,這些屬性會自動添加到根元素中。如果子組件的根元素已有class或style屬性,則會與從父組件繼承的屬性合併。v-on事件監聽器也遵循相同規則。當組件嵌套時,降級屬性會自動轉發給子組件。
從 3.4 開始,推薦使用 defineModel() 巨集來自動化這個過程,讓寫法更加簡潔,支持多個 v-model 綁定,並可直接使用自定義修飾符。新方法還能同步父子組件的值,減少同步問題,使組件的開發與維護變得更方便
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
此為不負責任教學,介面操作依實際情況而有所異動 額外資源參考 [API] 串接 Imgur API 圖床服務,上傳到指定相簿 israynotarray超完整 Express Imgur 套件上傳教學 [前端筆記] 用 axios 串接 imgur API上傳圖片
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
此為不負責任教學,介面操作依實際情況而有所異動 額外資源參考 [API] 串接 Imgur API 圖床服務,上傳到指定相簿 israynotarray超完整 Express Imgur 套件上傳教學 [前端筆記] 用 axios 串接 imgur API上傳圖片
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息