本文綱領:
- 介紹 Vue元件 的相關概念
- 詳解 Vue元件 的用法
Vue元件 :介紹
- 官方文件:元件應用化構建
- 什麼是元件:元件(Component)是 可複用的Vue例項,是Vue最強大的功能之一,元件可以擴充HTML元素,封裝可重用的程式碼(包括html、css、js)。在較高層上時,元件是自定義元素,Vue編譯器為它提供特殊的功能,總結起來就是:元件是完成特定功能的一套自定義的HTML標籤。可以將其理解為預先定義好的 ViewModel類。
- 一個元件可以預先定義很多內容,但是最核心的有:
- 模板(template):模板反映了資料和最終展現給使用者的DOM之間的對映關係,也就是我們要複用的 HTML模板
- 初始資料(data):一個元件的初識資料狀態,對於可重用的元件來說,通常是私有的。
- 接收的外部的引數(props):元件之間可以通過引數來進行資料的傳遞和共享,引數預設是單向繫結,但也可以實現雙向繫結。
- 生命週期(鉤子函式):一個元件會觸發多個生命週期函式,在這些鉤子函式中可以封裝一些自定義邏輯。
- 元件的分類:
- 全域性元件、區域性元件、巢狀元件、單檔案元件
元件三步曲:定義、註冊、使用
全域性元件
- 簡單介紹全域性元件:
- 全域性元件即為所有的 Vue例項 都可以使用的元件。
- 註冊全域性元件的方法:
Vue.component('元件名',{ '模板和方法' }) //注意:元件名不要有大寫字母,多個單詞使用中劃線 '-'隔開
- 元件的
template
模板必須有且僅有一個根標籤,即在template
中,所有的內容都要用一個標籤包裹起來。 - 應用場景:若該元件的功能需在任何被Vue例項掛載的標籤中引用,則建議用全域性元件
- 注意:全域性元件必須寫在Vue例項建立之前,才會在引用中生效,否則會報錯
- 全域性元件的三種用法:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <!-- 匯入Vue包 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <body> <!-- 元件三部曲:定義、註冊、引用 --> <h1>全域性元件</h1> <hr > <!-- ======================= 引用全域性元件:方式1 ======================= --> <div id="A"> <compon1></compon1> <!--使用--> <hr > </div> <script type="text/javascript"> Vue.component('compon1', { //註冊 template: '<h2>引用全域性元件:方式1</h2>' //定義 }) var A = new Vue({ el: '#A', }) </script> <!-- ======================= 引用全域性元件:方式2 ======================= --> <div id="B"> <compon2></compon2> <!--使用--> </div> <script type="text/template" type="text/javascript" id="compon2"> /* 定義元件(這個div是根標籤) */ <div> <h2>引用全域性元件:方式2</h2> <p>我是通過'script'標籤定義的</p> <hr > </div> </script> <script type="text/javascript"> Vue.component('compon2',{ //註冊 template: '#compon2', //定義 }) var B = new Vue({ el: '#B', }) </script> <!-- ======================= 引用全域性元件:方式3 ======================= --> <div id="C"> <compon3></compon3> <!--使用--> </div> <template id="compon3"> <!-- 定義(這個div是根標籤) --> <div> <h2>引用全域性元件:方式3</h2> <p>我是通過'template'標籤定義的</p> <hr > </div> </template> <script type="text/javascript"> Vue.component('compon3',{ //註冊 template: '#compon3' //定義 }) var C = new Vue({ el: '#C', }) </script> </body> </html>
區域性元件
- 簡單介紹區域性元件:
- 個人認為區域性元件的優點是相對於全域性元件而言的,例如,當你使用 webpack 這樣的構件系統時,如果註冊的是全域性元件,就意味著不管你是否使用,此元件都會存在於你構件的系統中,造成無謂的 js載入,而區域性元件只需要在你的根例項裡面去呼叫這個定義的元件即可。
- 與全域性元件一樣,元件的
template
模板必須有且僅有一個根標籤,即在template
中,所有的內容都要用一個標籤包裹起來。
- 區域性元件的三種用法:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <!-- 匯入Vue包 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <body> <!-- 元件三部曲:定義、註冊、引用 --> <h1>區域性元件——定義在某個Vue例項上的</h1> <hr > <!-- ======================= 引用區域性元件:方式1 ======================= --> <div id="A"> <compon1></compon1> <!--引用--> <hr > </div> <script type="text/javascript"> var A = new Vue({ el: '#A', components: { //註冊 'compon1': { //定義 template: '<h2>引用區域性元件:方式1</h2>' } } }) </script> <!-- ======================= 引用區域性元件:方式2 ======================= --> <div id="B"> <compon2></compon2> <!--引用--> <hr > </div> <script type="text/template" id="compon2"> //定義元件(這個div是根標籤) <div> <h2>引用區域性元件:方式2</h2> <p>我是通過'script'標籤定義的</p> </div> </script> <script type="text/javascript"> var B = new Vue({ el: '#B', components: { //註冊 'compon2': { //定義 template: '#compon2' } }, }) </script> <!-- ======================= 引用區域性元件:方式3 ======================= --> <div id="C"> <compon3></compon3> <!--引用--> <hr > </div> <template id="compon3"> <!-- 定義元件(這個div是根標籤) --> <div> <h2>引用區域性元件:方式3</h2> <p>我是通過'template'標籤定義的</p> </div> </template> <script type="text/javascript"> var C = new Vue({ el: '#C', components: { //註冊 compon3: { //定義 template: '#compon3', } } }) </script> </body> </html>
元件巢狀
- 簡介:如下圖所示,元件之間是可以相互巢狀的:
- 父元件中巢狀子元件的方法:
<div id="container"> <h3>我愛吃什麼水果有這些:</h3> <ol> <todolist></todolist> <!-- 引用 --> </ol> </div> <script type="text/javascript"> //定義子元件 var child = Vue.extend({ template: "<div>巢狀的子元件</div>", }); //定義父元件 var todolist = Vue.extend({ template:'<div><li v-for="item in datas">{{item.text}}</li><child></child></div>', data(){ return{ datas: [ { id: 0, text: '蘋果' }, { id: 1, text: '香蕉' }, { id: 2, text: '雪梨' }, ] } }, components: { 'child': child, } }); //定義一個Vue例項 var app = new Vue({ el: '#container', data: {}, components: { //註冊(當然也可以用"Vue.component('todolist',todolist);"全域性註冊) 'todolist': todolist, } }) </script>
- 注意:在使用子元件之前必須先定義子元件,否則會報錯
- 元件中的資料必須是函式,元件中的資料的定義為:
'元件名':{ template: "...", data: function(){ return { 鍵 : 值, } } }
- 為什麼這裡的
data
的值是一個函式呢,因為我們這裡定義的元件很有可能被複用,如果像普通的一個Vue例項,那麼改動一個地方,就會引起整個元件的改變
但是我們每次複用組建的情況都可能不同,所以用一個function
來返回物件- 換句話說,元件的
data
是私有的,該data
中的資料只能在對應的元件模板中使用
- 換句話說,元件的
- 為什麼這裡的