---
# System prepended metadata

title: 元件樣板建立及綁定方式(補) (4-2)
tags: [4. 元件, Vue]

---

# 元件樣板建立及綁定方式(補) (4-2)
###### tags: `Vue`、`4. 元件`
2022.3.4

### 1. 樣板建立方式
#### template(一般)
```
<oldmoon></oldmoon>

<script>
    const app = Vue.createApp({
        data(){
            return{
                text:'這是內部資料'
            }
        },
    })
    
    app.component('oldmoon1',{
        template:`<h2>這是元件1</h2>`
    });
    
    app.mount('#app');
</script>
```
#### x-template
```
<oldmoon></oldmoon>

<!-- 另外存放元件資料(template) -->
<script type="text/x-template" id='oldmoon_template'>
    <h2>{{ text }}</h2>
</script>
<!------------------------------>

<script>
    const app = Vue.createApp({
        data(){
            return{
                text:'這是內部資料'
            }
        }
    });
    
    app.component('oldmoon',{
        data(){
            return{
                text:'這是外部元件'
            }
        },
        template:'#oldmoon_template'
    });
    
    app.mount('#app')
    
</script>
```
#### 單文件元件 (單一檔案包含HTML, JS, CSS)
&emsp;&emsp;補 (較為簡單，使用方法與x-template接近)
### 2. 元件運用
#### 直接使用標籤名稱
```
<元件名稱></元件名稱>
```
#### 搭配v-for
```
//----------------Bootstrap套件-----------------
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
//----------------------------------------------\

<oldmoon v-for="i in array" :key="i"></oldmoon>

<script>
    const app = Vue.createApp({
        data(){
            return{
                array:[1,2,3]
            }
        }
    });
    
    app.component('oldmoon',{
        template:`<div class="alert alert-primary" role="alert">這是外部資料</div>`
    });
    
    app.mount('#app')
</script>

```
#### 使用v-is綁定(可動態)
* 一般綁定
元件名稱一定要用「''」包裹
```
<div v-is="'元件名稱'"><div>
```  
* 動態屬性
```
<input type="text" v-model="component_name">
<div v-is="component_name"></div>

<script>
    const app = Vue.createApp({
        data(){
            return{
               component_name : '請輸入元件名稱'
    }}});
    
    app.component('oldmoon1',{
        template:`<h1>這是元件1</h1>`
    });
    
    app.component('oldmoon2',{
        template:`<h1>這是元件2</h1>`
    });
    
    app.mount('#app')
</script>
```
備註：v2舊版寫法(不用記)
`<component v-bind:is="component_name"></component>`

### 3. 動態標籤實戰技巧
&emsp;&emsp;表格製作，用非動態屬性調換元件，會讓HTML程式碼跑到最上面，所以要改用v-is方法讓元件渲染時不會跑格式。
```
<table class="table">
    <thead>
        <tr>
            <th scope="col">標題1</th>
            <th scope="col">標題2</th>
            <th scope="col">標題3</th>
        </tr>
    </thead>
    <tbody>
        <tr v-is="'oldmoon'"></tr>
    </tbody>
</table>

<script>
const app = Vue.createApp({
    data(){
        return{
            text:'這是內部資料'
        }
    }
});

app.component('oldmoon',{
    data(){
        return{
            text:['1-1','1-2','1-3']
        }},
    template:`<td v-for="(item,key) in text" :key="key">{{ item }} </td>`
})
app.mount("#app")
</script>
```