Skip to content

Vue 3 實戰:從零到一掌握 Component 元件封裝與核心觀念

Vue 3 元件介紹:單檔案元件 SFC

在現代前端開發中,元件(Component) 是構建應用程式的基石。簡單來說,元件就是一個 可複用、獨立且封裝 的 UI 單元。

Vue 透過 SFC(Single File Component,單檔案元件) 規範,將 HTML 模板、JavaScript 邏輯與 CSS 樣式整合在 .vue 檔案中。元件之間透過 props 接收外部資料、利用 emits 向外發送事件,並透過 slots 插入自定義內容,實現高度靈活的介面設計。

最基本的 Vue 3 元件結構(SFC)

在 Vue 3 中,我們最推薦使用 <script setup> 語法糖,這能讓程式碼更簡潔且具備更好的效能。

vue
<script setup>
import { ref } from "vue";

const title = "我是元件";
const count = ref(0);
</script>

<template>
  <div class="card">
    <h2>{{ title }}</h2>
    <button @click="count++">點我 {{ count }}</button>
  </div>
</template>

<style scoped>
.card {
  border: 1px solid #ccc;
}
</style>

區塊說明

  • <script setup>: 定義 響應式資料、方法與邏輯。它是 Composition API 的入口。
  • <template>: 以 模板語法 定義 HTML 結構,Vue 會自動追蹤此處使用的變數並在資料改變時更新畫面。
  • <style scoped>: 定義 CSS 樣式。加入 scoped 屬性能確保樣式局部化,不會污染到外部或其他元件的樣式。

元件化開發的三大核心特性

可複用性 (Reusability)

寫好一個 按鈕卡片 元件後,您可以在分頁 A、分頁 B 重複使用它。當您需要改掉按鈕的圓角時,只需要修改這個元件檔,全站都會同步更新。

封裝性 (Encapsulation)

每個元件內部都有獨立的狀態(State)。除非您刻意傳遞,否則元件 A 的變數不會影響到元件 B。這就像每台電腦都有自己的 CPU 和記憶體,互不干擾。

階層樹狀結構 (Component Tree)

Vue 應用程式是由一個 根元件 (Root) 開始,向下延伸出無數的子元件,形成像樹一樣的結構。

元件的生命週期 (Lifecycle)

每個元件從出生到死亡都會經歷特定的階段。Vue 提供了 生命週期 鉤子(Hooks),讓您可以在特定時間點執行程式:

  • onMounted: 元件剛被放入網頁時(適合呼叫 API 取資料)。
  • onUpdated: 資料改變,畫面重新渲染時。
  • onUnmounted: 元件被移除時(適合清除計時器或監聽器)。

TIP

簡單來說,元件化就是將複雜的問題拆解成多個簡單的小單元。當您學會如何設計良好的元件介面,就掌握了 Vue 開發的精髓。

元件之間怎麼傳遞資料?

元件拆得越細,彼此溝通就越重要。Vue 依照關係的遠近提供了不同的管道:

情境機制
父層把資料交給子層props
子層通知父層emit
父子雙向同步defineModel
沒宣告的屬性與事件透傳屬性 attrs
跨越多層、避免逐層轉交provide / inject
把畫面片段交給元件內部渲染插槽 slots

常見問題

什麼是單檔案元件(SFC)?

SFC 是副檔名為 .vue 的檔案,把一個元件的 templatescriptstyle 寫在同一個檔案裡。它需要 Vite 這類建置工具 編譯,是 Vue 專案的標準開發方式。

script setup 與一般 script 有什麼差別?

<script setup> 是編譯期語法糖,頂層宣告的變數與函式會自動暴露給模板,不必手動 return,程式碼更精簡,效能也略優。它是 Vue 3 目前推薦的寫法。

style scoped 是怎麼做到樣式不外洩的?

編譯時 Vue 會為該元件的元素加上唯一的屬性標記,並把選擇器改寫成帶有該屬性的形式,因此樣式只會作用在這個元件的元素上。

元件之間要怎麼傳遞資料?

父傳子用 props、子通知父用 emit、需要雙向同步用 defineModel、未宣告的屬性由 attrs 透傳,跨越多層則用 provideinject

元件檔名該怎麼命名?

官方風格指南建議使用 PascalCase,例如:ProductCard.vue,並且用多個單字組成,避免與原生 HTML 標籤衝突。

一個元件應該拆到多細?

是否會被重複使用單一職責 為準。同一段畫面在兩個地方以上出現,或某個區塊有自己獨立的狀態與邏輯時,就值得拆成元件。

延伸閱讀