WeHelp
Vue 是一款用於建構使用者介面的 JavaScript 前端框架,提供高效的資料綁定與組件化開發能力。
  1. Vue 框架簡介
  2. Vite 專案管理
  3. 第一個 Vue 專案
  4. Vue 專案結構
  5. 樣板語法,內文與屬性
  6. 樣板語法,流程控制
  7. 樣板語法,事件處理
  8. Vue 響應式狀態
  9. 表單與響應式狀態
  10. 組件開發:基本觀念
  11. 組件開發:傳遞屬性
  12. 組件開發:自訂事件
  13. 組件的生命週期
  14. 串接後端資料
組件開發:基本觀念
## 一、Vue 組件的基本觀念 Vue 的組件(Component)是一個可重複使用、獨立管理的介面單位。每個組件通常包含三個部分: ```vue <template> <!-- HTML 結構 --> </template> <script> // JavaScript 邏輯 </script> <style> /* CSS 樣式 */ </style> ``` ### 1. `template` 負責描述畫面結構,語法接近 HTML。 ```vue <template> <h1>網站標題</h1> </template> ``` ### 2. `script` 負責撰寫組件的邏輯,例如資料、方法或生命週期。若目前只是靜態畫面,也可以不撰寫內容。 ```vue <script setup> // 組件邏輯 </script> ``` ### 3. `style` 負責組件的視覺樣式。加上 `scoped` 後,樣式只會套用在目前組件中。 ```vue <style scoped> h1 { color: #42b883; } </style> ``` ### 4. 組件可以互相組合 一個 Vue 組件可以引入並使用另一個組件: ```vue <script setup> import WelcomeCard from './components/WelcomeCard.vue' </script> <template> <WelcomeCard /> </template> ``` 本範例使用兩個組件: 1. `App.vue`:主要頁面組件 2. `WelcomeCard.vue`:內容卡片組件 兩個組件之間沒有使用 Props、Emit 或其他資料傳遞功能,所有內容都是固定的靜態文字。 --- # 二、基本靜態網頁範例 ## 專案結構 ```text src/ ├── App.vue ├── main.js └── components/ └── WelcomeCard.vue ``` --- ## 1. `src/App.vue` ```vue <script setup> import WelcomeCard from './components/WelcomeCard.vue' </script> <template> <div class="page"> <header class="site-header"> <div class="logo">My Website</div> <nav class="navigation"> <a href="#">首頁</a> <a href="#">關於我們</a> <a href="#">聯絡方式</a> </nav> </header> <main class="main-content"> <section class="hero"> <p class="subtitle">WELCOME TO VUE</p> <h1>使用 Vue 建立簡單網頁</h1> <p class="description"> 這是一個由 Vue 組件組合而成的靜態網頁範例。 </p> <WelcomeCard /> </section> </main> <footer class="site-footer"> © 2025 My Website </footer> </div> </template> <style scoped> * { box-sizing: border-box; } .page { min-height: 100vh; display: flex; flex-direction: column; background-color: #f5f7fb; color: #263238; } .site-header { display: flex; align-items: center; justify-content: space-between; padding: 20px 64px; background-color: #ffffff; border-bottom: 1px solid #e5e7eb; } .logo { color: #42b883; font-size: 24px; font-weight: bold; } .navigation { display: flex; gap: 24px; } .navigation a { color: #4b5563; text-decoration: none; font-size: 15px; } .navigation a:hover { color: #42b883; } .main-content { flex: 1; display: flex; justify-content: center; align-items: center; padding: 64px 24px; } .hero { width: 100%; max-width: 760px; text-align: center; } .subtitle { margin-bottom: 12px; color: #42b883; font-size: 14px; font-weight: bold; letter-spacing: 2px; } h1 { margin: 0 0 16px; font-size: 42px; } .description { margin-bottom: 32px; color: #64748b; font-size: 18px; } .site-footer { padding: 20px; background-color: #263238; color: #ffffff; text-align: center; font-size: 14px; } </style> ``` --- ## 2. `src/components/WelcomeCard.vue` ```vue <template> <article class="card"> <div class="icon">🌱</div> <h2>Vue 組件化開發</h2> <p> 將網頁拆分成多個獨立組件,可以讓程式結構更清楚,也方便未來重複使用。 </p> <a href="#" class="button">了解更多</a> </article> </template> <style scoped> .card { max-width: 520px; margin: 0 auto; padding: 32px; background-color: #ffffff; border-radius: 16px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08); } .icon { margin-bottom: 16px; font-size: 42px; } h2 { margin: 0 0 12px; color: #1f2937; } p { margin: 0 0 24px; color: #64748b; line-height: 1.8; } .button { display: inline-block; padding: 10px 20px; border-radius: 8px; background-color: #42b883; color: #ffffff; text-decoration: none; } .button:hover { background-color: #369d6f; } </style> ``` --- ## 3. `src/main.js` ```javascript import { createApp } from 'vue' import App from './App.vue' createApp(App).mount('#app') ``` --- ## 三、組件關係 ```text App.vue └── WelcomeCard.vue ``` `App.vue` 透過下面的方式引入 `WelcomeCard.vue`: ```vue <script setup> import WelcomeCard from './components/WelcomeCard.vue' </script> ``` 接著在模板中使用: ```vue <WelcomeCard /> ``` 本範例沒有使用: - `props`:父組件傳資料給子組件 - `emit`:子組件通知父組件 - `ref` 或 `reactive`:動態狀態資料 - API 或資料庫 - 事件處理 因此它是一個單純由兩個 Vue 組件組合而成的靜態網頁。
相關學習地圖、教學課程
F2E 網站前端工程
從 0 開始,成為網站前端工程師的學習路徑。