# 組件註冊

組件有兩個方式可以註冊: 全域註冊及區域註冊。

全域註冊是直接在 Vue 物件中註冊組件,在整個 Vue.js 應用程式中都可以使用這個組件。

而區域註冊是在各個實體中的選項物件設定,這樣的設定方式只有這個實體才可以使用這個組件。

# 全域註冊

在註冊全域組件時要給予兩個參數: 組件名稱選項物件:

Vue.component('component-a', {
  // options
  template: `
    <div>a</div>
  `
});

這樣一來我們就可以之後的任何實體中使用這個組件:

var vm = new Vue({
  el: '#app'
});
<div id="app">
  <component-a></component-a>
</div>

不只是 new Vue 實體可以使用,連其他組件也可以使用:

Vue.component('component-a-copy', {
  template: `
    <component-a></component-a>
  `
});

# 區域註冊

全域註冊有個缺點: 不管有沒有使用到這個組件,只要使用全域註冊就一定會載入,因此使用全域註冊會將原本不需要的組件也載入進來,拖慢載入的時間。

所以針對某些特定實體設計的組件就可以用區域註冊的方式,註冊在需要它的組件中。

區域註冊會是一個選項物件:

const componentC = {
  // options
  template: `
    <div>c</div>
  `
};

這個物件可以由 components 這個選項物件屬性載入實體內:

var vm = new Vue({
  el: '#app',
  components: {
    'component-c': componentC
  }
});

除了 new Vue 實體外,也可以在組件中使用:

Vue.component('component-d', {
  components: {
    'component-c': componentC
  },
  template: `
    <component-c></component-c>
  `
});

componentskey 值是這個組件的名稱,而 value 值就是組件的選項物件

# 全域跟區域註冊的差別

這樣就完成註冊了,我們建立兩個實體看看這兩種註冊方法的差別:

Vue.component('component-a', {
  template: `
    <div>a</div>
  `
});

const componentC = {
  template: `
    <div>c</div>
  `
};

var vm = new Vue({
  el: '#app',
  components: {
    'component-c': componentC
  }
});

var vm2 = new Vue({
  el: '#app2'
});

我們有 vmvm2 兩個實體, 而使用的組件有 aca 是全域組件,而 c 是區域組件,只有 vm 有註冊 c 組件。

現在我們在頁面上配置 appapp2 ,兩個都載入 ac 組件:

<h2>app</h2>
<div id="app">
  <component-a></component-a>
  <component-c></component-c>
</div>
<h2>app2</h2>
<div id="app2">
  <component-a></component-a>
  <component-c></component-c>
</div>

結果如下:

diff

可以看到因為 app2 沒有載入 c 區域組件,所以它不知道如何渲染 c 組件,就照原樣放在 HTML 上。

a 組件因為是全域組件,所以在任何的實體上都可以使用。

# 組件命名

組件的名稱需要依照 W3C (opens new window) 的客製標籤名稱(全部小寫並且需要包含連字符號( - ))來命名,避免發生衝突。

# 使用 kebab-case 命名

剛剛的例子都是使用 kebab-case 命名:

Vue.component('component-a', {  // kebab-case
  template: `
    <div>a</div>
  `
});

...

var vm = new Vue({
  el: '#app',
  components: {
    'component-c': componentC   // kebab-case
  }
});

kebab-case 會是全小寫,並且在字與字之間用連字符號( - )串聯。

# 使用 PascalCase

Vue.component('componentB', {   // PascalCase
  template: `
    <div>b</div>
  `
});

var vm = new Vue({
  el: '#app',
  components: {
    componentC: componentC  // PascalCase
  }
});

PascalCase 的字首大寫,並且每個字開頭都大寫。

ES2015+ (opens new window) 中可以把 componentC: componentC 改為 componentC ,這樣的設定方是代表 keyvalue 都是設定 componentC 的意思。

PascalCase 的名稱在 DOM 中使用只能轉換為 kebab-case 使用:

<div id="app">
  <component-b></component-b>
  <component-c></component-c>
</div>

# DEMO

# 結語

本文介紹了組件的兩種註冊方式: 全域區域,以及兩種命名方式: kebab-casePascalCase

# 參考資料