# 前言

雖說單一元件檔案的程式因為有 script setup 語法,能讓程式變得乾淨俐落。

不過並不是每個人都會使用 vite (或以前的 vue cli) 來使用 Vue。

用 CDN 引入 Vue 的程式開發方式,其實也能使用元件。

這篇文章要來記錄一下,這種方式使用元件的語法。

# 在輕前端使用元件

還記得可以宣告一個變數去接 Vue.createApp 回傳出來的東西嗎?

const app = Vue.createApp({});
app.mount("#app");

一樣,那個 app 變數,代表能變的數 (好像在講廢話),可以自由宣告。

而元件的定義,就是需要透過這個變數來創造:

const app = Vue.createApp({});
//component 第一個參數會是元件的名字,第二個參數是物件
app.component("my-component", {});
// 內容沒打錯,本來就沒說一定要綁在 id = app 的節點。
// 我偏要綁在 class = app 的節點
app.mount(".app");

透過實體的 component 方法,我們可以針對這個實體去定義它的子元件

記得生命週期說的嗎?

Vue 的實體本身就是一個元件,只要是元件都有它的生命週期。

用 component 定義的元件當然也不例外。

component 第一個參數是定義元件名稱,規則等等來說明,而第二個參數就是一個物件,再看一次:

app.component("my-component", {});

而這個物件的內容可以寫的東西,就跟 createApp 中的物件完全一樣。

只不過 createApp 的模板可以直接用 #app 李面的內容取代,元件則必須寫在 template 裡面:

app.component("my-component", {
  template: `<h1> myApp:{{ data}} </h1>`,
  setup() {
    const data = Vue.ref("aaaa");
    return { data };
  },
});

為了方便排版,用這種模式定義的元件通常會使用 ES6 模板語法 (``) 來操作。

定義好元件之後,就可以在 #app 中使用這個名稱:

<div id="app">
  <my-component></my-component>
</div>

由於這個東西已經包成元件,表示它擁有重複使用的特性:

<div id="app">
  <my-component></my-component>
  <my-component></my-component>
  <my-component></my-component>
</div>

# 元件標籤命名

一般來說,只要使用合法的 JS 屬性名稱,都可以當作 Vue 的元件名稱。

不過要知道的是,當我們建立好元件,對這個元件定義的名稱,最後是會放到 HTML 上面使用,為了避免名稱定義成跟 HTML tag 相同的字眼,通常建議以兩個以上的單字來命名。

你可能會疑惑怎麼可能定義出 HTML 標籤的名稱,標籤不都叫 h1divp 這種沒意義的字嗎?

舉例來說,我們想建立一個對話框的元件,於是將元件名稱定義成 dialog ,或者我們想建立一個跑馬燈的元件,跑去找 google 翻譯,想知道這兩個東西的英文叫什麼,於是得到這兩個結果


於是我們就很開心的把單字寫到元件名稱中:

app.component("dialog", {});
app.component("marquee", {});

不過你知道嗎?這兩個單字,就剛好是 HTML 中就有的標籤!
你可以點超連結進去看 MDN
對話框
跑馬燈

雖然跑馬燈標籤 <marquee> 已經是官方定義不推薦使用的標籤,不過瀏覽器目前還是有支援這個標籤的運作。

我想除非真的很專精 HTML 所有標籤,否則我們很難辨別單一一個單字是不是會跟 HTML 既有標籤衝突。
最簡單的方式,就是直接使用兩個以上的單詞宣告元件名稱,例如 <run-horse-light><dialog-box>

除了這種寫法,也可以用 JS 愛用命名方式,駝峰:

app.component("runHorseLight", {});
app.component("dialogBox", {});

在使用上,如果在 .html 檔案中要寫元件,必須使用連字號的寫法:

<div id="app">
  <dialog-box></dialog-box>
</div>

如果使用駝峰寫法,.html 檔案看不懂:
以下是不支援的寫法

<div id="app">
  <dialogBox></dialogBox>
</div>

不過如果是昨天提到的 SCF .vue 檔案,在 template 標籤中,這兩種寫法都可以:

<template>
    <!-- 這個是 .vue 檔案中的 Template 標籤, 不是 v-if 或 v-for 使用的那個 -->
  <dialog-box></dialog-box>
  <dialogBox></dialogBox>
</template>