---
# System prepended metadata

title: 元件 (4-1)
tags: [4. 元件, Vue]

---

# 元件 (4-1)
###### tags: `Vue`、`4. 元件`
2022.3.3

### 1. 元件優勢
* 增加程式碼可複用性
* 避免單一檔案過大 (一個好的網頁，code範圍在200~300區間)
* 易於管理及協作
* 元件功能獨立化

### 2. 註冊元件手法
* 元件需要再createApp後，mount前進行定義。
* 元件需指定一個特定名稱。
* 元件結構與最外層的根原件結構無異(除了增加Template的片段)
* 原件另有prop，emits等資料傳遞及事件傳遞

#### 全域註冊
&emsp;&emsp;在createApp下任何元件都可以運用，在中小型專案、一般網頁開發很方便。

![](https://i.imgur.com/QFBkKJn.png)

* 第一種寫法形式
```
<oldmoon></oldmoon>

<script>
    const app = Vue.createApp({
        data(){
            return{
                text:"這是內部文字",
            }
        },
    }).component('oldmoon',{
        data(){
            return{
                text:"這式元件文字",
            }
        },
        template:`<input type="text" v-model="text">`
        }).mount('#app')
</script>
```
* 第二種寫法
```
<oldmoon></oldmoon>
<script>
    const app = Vue.createApp({
        data(){
            return{
                text:"這是外部文字",
            }
        },
    })
    app.component('oldmoon',{
        data(){
            return{
                text:"這是外部文字",
            }
        },
        template:`<input type="text" v-model="text">`
    }).mount('#app');
</script>
```
* 掛載多個全域元件
```
<script>
    const app = Vue.createApp({
        data(){
            return{
                text:"這是內部元件"
            }
        }
    });
    
    app.component('oldmoon',{
        data(){
            return{
                text:"這是外部元件1"                 }
        },
        template:`<input type="text" v-model="text">`
    }).component('oldmoon1',{
        data(){
            return{
                text:"這是外部元件2"
            }
        },
        template:`<input type="text" v-model="text">`
    }).mount("#app");
</script>
```

#### 區域註冊
&emsp;&emsp;限制特定元件下才可使用，在Vue Cli中很常使用此方法。(便於管理)
* 掛載在app下的元件
```
<oldmoon></oldmoon><br>
<oldmoon1></oldmoon1>

<script>
    const oldmoon = {
        data(){
            return{
                text:'這是外部資料1'
            }
        },
        template:`<input type="text" v-model="text">`
    }
    
    const oldmoon1 = {
        data(){
            return{
                text:'這是外部資料2'
            }
        },
        template:`<input type="text" v-model="text">`
    }
    
    const app = Vue.createApp({
        data(){
            return{
                text : "這是內部資料"
            }
        },
        components:{
            oldmoon,
            oldmoon1
        }
    })
    
    app.mount('#app')
</script>
```
* 掛載在元件中的元件，只作用於此元件。
```
<oldmoon1></oldmoon1>
<script>
    const oldmoon2 = {
        data(){
            return{
                text:"這是元件2"
            }},
            template:'<h3>{{ `${text}:`}}</h3>'
        };
    
    const app = Vue.createApp({
        data(){
            return{
                text:"這是內部資料"
            }}
    }).component('oldmoon1',{
        data(){
            return{
                text:"這是外部元件1"
        }},
        components:{
            oldmoon2
        },
        template:`<oldmoon2></oldmoon2> <input type="text">`
    }).mount('#app')
    
</script>
```
#### 模組化
&emsp;&emsp;同屬於區域註冊，Vue Cli忠實站運用技巧

檔案:「component.js」
```
    export const oldmoon1 = {
        data(){
            return{
                text:'這是外部模組匯入元件1'
            }},
        template:`<input type="text" v-model="text">`
    };
    
    export const oldmoon2 = {
        data(){
            return{
                text:'這是外部模組匯入元件2'
            }},
        template:`<input type="text" v-model="text">`
    }
```

檔案:「index.html」
```
<oldmoon1></oldmoon1><br>
<oldmoon2></oldmoon2>

<script type="module">
    import {oldmoon1,oldmoon2} from './component.js';
    
    const app = Vue.createApp({
        data(){
            return{
                text:'這是內部資料'
            }
        },
        components:{
            oldmoon1,
            oldmoon2
        }
    }).mount("#app")
</script>
```