2025-03-23-MyBadge.vue 元件的設計原理與概念
2025-03-23-MyBadge.vue 元件的設計原理與概念
一步步解釋這個 MyBadge.vue 元件的設計原理與概念**,幫你搞懂為什麼這裡用了 :style、:class,以及這整體的元件架構是怎麼思考的。
🧠 設計目的:讓 Badge 能夠「高度自訂」
這個元件的目標是:
| 功能 | 使用者能控制什麼? |
|---|---|
| 背景顏色 | 用 color props 傳入 |
| 文字顏色 | 用 textColor props 傳入 |
| 顯示文字 | 用 label props 傳入 |
| 圓角外觀 | 用 rounded 布林值 props 控制 |
我們希望使用者用法像這樣 👇:
1 | <MyBadge label="Success" color="green" text-color="white" :rounded="true" /> |
所以元件內部需要根據這些 props 去調整樣式與內容。
🔍 為什麼使用 :style?
這是因為「背景顏色與文字顏色」是變化非常多的值(可能是任意色碼),無法提前寫死在 CSS class 中。
✅ 用 :style 是最靈活的方法:
1 | :style="badgeStyle" |
1 | const badgeStyle = computed(() => ({ |
這會動態幫你加上類似這樣的行內樣式:
1 | <span style="background-color: green; color: white">Success</span> |
🔁 重點是:「color 跟 textColor 是動態變化的變數」,不適合寫死在 CSS。
🔍 為什麼使用 :class?
因為 rounded 是一個「開 / 關」的布林選項,所以只要有 true 就加上一個固定的 class,樣式可以寫死。
1 | :class="{ rounded }" |
這寫法的意思是:
- 如果
rounded === true,就加上 class"rounded" - 否則不加
然後在 CSS 中你有:
1 | .rounded { |
✅ 因為這個 border-radius 的樣式是固定不變的,可以寫在 CSS。
🧱 小結:什麼時候用 :style?什麼時候用 :class?
| 類型 | 用 :style |
用 :class |
|---|---|---|
| 值是變化多端的(如顏色) | ✅ | ❌ 太多 class 不好維護 |
| 只有 true / false 或少數幾種選擇 | ❌ | ✅ class 控制清楚好維護 |
| 需要被覆蓋或繼承(例如 RWD) | ❌ | ✅ CSS class 更適合寫媒體查詢 |
| 動態設計師輸入值、顏色、字體 | ✅ | ❌ |
🧠 元件設計的整體思維
| 面向 | 設計思考 |
|---|---|
| 資料傳入 | 用 props 把控制權交給父元件 |
| 外觀設計 | 能靈活指定背景、文字顏色、圓角 |
| 程式可讀性 | 讓每個 props 功能清楚、用途單一 |
| 元件通用性 | 把「樣式 + 組件結構」分開設計 |
✅ 小總結
你這次的元件 MyBadge.vue 設計非常符合 Vue 的「高內聚、低耦合」原則:
| 功能 | 技術解法 |
|---|---|
| 背景與文字顏色 | 用 :style 傳入自訂色碼 |
| 圓角控制 | 用 :class 搭配布林值 |
| 顯示文字 | 用 label props |
| 簡潔的樣式範圍 | 使用 scoped 保護 CSS 不外洩 |
如果你理解這一題,以後你就可以自信地設計像:
MyButton.vue(控制大小、顏色、是否 disabled)MyTag.vue(多種主題樣式)MyCard.vue(支援插槽與變化)
這是 Vue 3 的 Composition API 中的一種寫法,搭配 JavaScript 的「箭頭函式」語法。這行的意思是建立一個 computed 計算屬性,名稱是 badgeStyle,會根據 props.color 和 props.textColor 自動更新樣式。
🔍 一步步解釋
🔹 computed(() => (...)) 是什麼?
computed()是 Vue 提供的函式,用來建立一個 「可自動追蹤依賴的變數」。- 只要裡面用到的值(像是
props.color)有變化,它就會重新計算。 - 常用來做樣式、文字內容的動態處理。
1 | const badgeStyle = computed(() => ({ |
代表的意思是:
badgeStyle 是一個物件,裡面有
backgroundColor和color,這兩個會隨著props.color和props.textColor自動變化。
🔹 為什麼要用 :style="badgeStyle"?
因為 badgeStyle 是一個 JavaScript 物件,我們要把它當作 HTML 的 style 屬性來使用。
:style="badgeStyle"是 Vue 的語法糖,意思是:綁定一個樣式物件到這個元素上- 最後會變成這樣的 CSS:
1 | <span style="background-color: red; color: white">...</span> |
🔹 那 :class="{ rounded }" 又是什麼意思?
rounded是一個 布林值 prop:class="{ rounded }"的意思是:如果
rounded: true,就加上class="rounded"
這樣就能控制是否要讓這個 badge 加上圓角樣式:
1 | .rounded { |
🧠 總結設計概念
| 功能 | 使用方式 | 原因 |
|---|---|---|
| 顏色樣式 | :style="badgeStyle" |
動態產生的多組 CSS 屬性 |
| 圓角切換 | :class="{ rounded }" |
控制要不要加上一個 class(布林值) |
| 傳入資料 | props |
讓父元件可以決定 badge 的內容與樣式 |
這樣設計可以讓元件 通用、彈性高、可重複使用。