本文同步發表於Andy's Blog
今天終於要進入Vue Component單元勒(撒花),而在接下來幾天我們會來慢慢介紹元件的相關內容,那我們就開始吧!
引用Kuro老師和Summer部落格內容整理如下:
每個 Vue.js 的應用程式都是從Vue建構式 (vue constructor) 建立根實體 (root vue instance) 開始
(圖片灰底部分)
,再一個個將元件 (Components) 搭建上去而來的。而元件提供HTML DOM元素的擴充性
這讓我們可以將程式碼封裝起來並且方便重複使用。
如下圖
圖片來源:六角學院
補充:上面提到的HTML DOM元素的擴充性是什麼意思呢?
簡單來說,就是我們可以將很多組HTML,包裝在一個元件內
new Vue({
el: '#app',
components: {
// register註冊
'my-component': {
template: `
<div> //最上層只能有一個tag,否則會出現下面圖示錯誤
<div>A custom component of Vue!</div>
<hr>
<div>A custom component of Vue!</div>
</div>`
}
}
});
寫法如下: 練習連結
HTML部分
<div id="app">
<first-component></first-component>
</div>
JavaScript部分
// create a root instance
new Vue({
el: '#app',
components: { //component`s`,有s喔
// register
'first-component': {
template: `
<div> //最上層只能有一個tag,Vue單節點特性
<div>A custom component of Vue!</div>
<hr>
<div>A custom component of Vue!</div>
</div>`
}
}
});
<script type="text/x-template" id="forCardTemplate">
<div class="card" style="width: 18rem;">
<div class="card-body">
<h5 class="card-title">卡片資料:{{ data }}</h5>
</div>
</div>
</script>
<script type="module">
var card = {
data: function(){
return {
data: '這裡有一段話'
}
},
template: '#forCardTemplate',
};
var app = new Vue({
components:{
//自定義名稱 //使用的組件內容
'card':card
},
el: '#app',
data: {
}
});
</script>
圖解:
透過變數 card
來定義組件內容,然後在components
選項中定義你想要使用的組件!
first-component
,「選項物件」則為其後的內容。<div id="app">
<first-component></first-component>
</div>
JavaScript部分
Vue.component('first-component',{
template: `
<div>
<div>A custom component of Vue!</div>
<hr>
<div>A custom component of Vue!</div>
</div>`
})
// create a root instance
new Vue({
el: '#app',
});
透過 `` 符號將HTML內容包起來
Vue.component('first-component',{
template: `
<div>
<div>A custom component of Vue!</div>
<hr>
<div>A custom component of Vue!</div>
</div>`
})
當今天我們template內容較為冗長時,我們可以透過script標籤
加上type="text/x-template"
並指定一個id
來使用。將封裝內容獨立出來。
寫法如下:
<script type="text/x-template" id="my-component">
<div class="component">
A custom component of Vue!
</div>
</script>
<script>
// global register
Vue.component('my-component', {
template: '#my-component',
});
// create a root instance
new Vue({
el: '#app',
});
</script>
區域註冊
與全域註冊
最大差別就是
限定全⼩寫
(可加入破折號 - ) 的標籤名稱方便辨識一、元件資料都是獨立的
1.透過props向內部組件傳遞數據
2.透過emit event觸發事件將資料往外送
圖片來源:六角學院
二、data必須是一個函數
寫法如下:
Vue.component("button-counter", {
data: function() {
return {
count: 0
};
}
});
備註:為何元件內資料必須為函數呢?
主要原因就是在ES6以前,function是切分變數最小單位,而在Vue元件中,為了避免元件與元件資料污染,因此Vue強制規定子元件data屬性
必須是函式,確保每個元件資料都是獨立的。
下面寫法是全域註冊還是區域註冊?
var CustomBlock = Vue.component('custom-block', {
template: `<div class="block">B</div>`,
});>
答案是全域註冊喔
,別搞錯摟~
感謝分享
補充 new Vue() 是 Vue 2 語法,
Vue 3 用 Vue.createApp() 取代 new Vue()
https://book.vue.tw/appendix/migration.html#%E5%85%83%E4%BB%B6%E5%AF%A6%E9%AB%94%E5%BB%BA%E7%AB%8B
Vue 2 support will end on Dec 31, 2023. Learn more about Vue 2 Extended LTS.
The Benefits of the New Vue 3 App Initialization Code