vue.js既然是框架,那就不能只是簡單的完成數據模板引擎的任務,它還提供了頁面佈局的功能。本文詳細介紹使用vue.js進行頁面佈局的強大工具,vue.js組件系統。 Vue.js組件系統 每一個新技術的誕生,都是為瞭解決特定的問題。組件的出現就是為瞭解決頁面佈局等等一系列問題。vue中的組件分為兩 ...
vue.js既然是框架,那就不能只是簡單的完成數據模板引擎的任務,它還提供了頁面佈局的功能。本文詳細介紹使用vue.js進行頁面佈局的強大工具,vue.js組件系統。
Vue.js組件系統
每一個新技術的誕生,都是為瞭解決特定的問題。組件的出現就是為瞭解決頁面佈局等等一系列問題。vue中的組件分為兩種,全局組件和局部組件。
組件的註冊
全局組件的註冊
通過Vue.component()創建一個全局組件之後,我們可以在一個通過 new Vue
創建的 Vue 根實例中,把這個組件作為自定義元素來使用。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../statics/vue.min.js"></script> </head> <body> <div id="app"> <!--第二步,使用--> <global_component></global_component> </div> <script> // 第一步,註冊 Vue.component("global_component", { template: ` <div> <h2>Hello Vue</h2> </div> ` }); new Vue({ el: "#app", }); </script> </body> </html>
組件的參數
因為組件是可復用的 Vue 實例,所以它們與 new Vue
接收相同的選項,例如 data
、computed
、watch
、methods
以及生命周期鉤子等。僅有的例外是像 el
這樣根實例特有的選項。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../statics/vue.min.js"></script> </head> <body> <div id="app"> <!--第二步,使用--> <global_component></global_component> </div> <script> // 第一步,註冊 Vue.component("global_component", { data: function () { return { count: 0 } }, template: `<button v-on:click="count++">You clicked me {{ count }} times.</button>` }); new Vue({ el: "#app", }); </script> </body> </html>
組件的復用
每個實例維護自己的一份獨立的數據。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../statics/vue.min.js"></script> </head> <body> <div id="app"> <!--第二步,使用--> <global_component></global_component> <global_component></global_component> <global_component></global_component> </div> <script> // 第一步,註冊 Vue.component("global_component", { data: function () { return { count: 0 } }, template: `<button v-on:click="count++">You clicked me {{ count }} times.</button>` }); new Vue({ el: "#app", }); </script> </body> </html>
註意當點擊按鈕時,每個組件都會各自獨立維護它的 count
。因為你每用一次組件,就會有一個它的新實例被創建。
Data必須是一個函數
data必須是一個函數,因此每個實例可以維護一份被返回對象的獨立的拷貝, 也可以寫成如下形式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../statics/vue.min.js"></script> </head> <body> <div id="app"> <!--第二步,使用--> <global_component></global_component> <global_component></global_component> <global_component></global_component> </div> <script> // 第一步,註冊 Vue.component("global_component", { data(){ return { count: 0 } }, template: `<button v-on:click="count++">You clicked me {{ count }} times.</button>` }); new Vue({ el: "#app", }); </script> </body> </html>
局部組件的註冊
全局註冊往往是不夠理想的。比如,如果你使用一個像 webpack 這樣的構建系統,全局註冊所有的組件意味著即便你已經不再使用一個組件了,它仍然會被包含在你最終的構建結果中。這造成了用戶下載的 JavaScript 的無謂的增加。
全局組件始終是存在的,除非程式結束,如果組件越來越大,那麼程式所占用的空間和消耗的性能就會更大。
所以我們需要局部組件。不用的時候,被垃圾回收。
局部組件的第一種使用方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../statics/vue.min.js"></script> </head> <body> <div id="component-demo"> <!--最後在根元素當中使用它--> <!--第一個中使用方式,會把當前div渲染進DOM--> <my-header></my-header> </div> <script> // 定義一個局部組件,其實就是一個變數,它是一個object類型 // 屬性與全局組件是一樣的 let Header = { template: ` <button @click="count++">{{ count }}</button> `, data() { return { count: 0 } } }; new Vue({ el: "#component-demo", // 第二部,需要在根實例當中使用它 components: { 'my-header': Header } }); </script> </body> </html>
局部組件的第二種使用方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../statics/vue.min.js"></script> </head> <body> <div id="component-demo"> </div> <script> // 定義一個局部組件,其實就是一個變數,它是一個object類型 // 屬性與全局組件是一樣的 let Header = { template: ` <button @click="count++">{{ count }}</button> `, data() { return { count: 0 } } }; new Vue({ el: "#component-demo", // 第二種使用方式,不會將div渲染進DOM,以template為根元素 template: `<my-header></my-header>`, // 第二步,需要在根實例當中使用它 components: { 'my-header': Header } }); </script> </body> </html>
對於 components
對象中的每個屬性來說,其屬性名就是自定義元素的名字,其屬性值就是這個組件的選項對象。
在局部組件中使用子組件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../statics/vue.min.js"></script> <style> body { margin: 0; } .box { width: 100%; height: 50px; background-color: #2aabd2; } </style> </head> <body> <div id="component-demo"> </div> <script> // 定義一個局部組件,其實就是一個變數,它是一個object類型 // 這個對象的屬性與全局組件是一樣的(除el屬性外) let Fcontent = { template: ` <div> <span>這是頭條</span> </div> ` }; let Header = { template: ` <div v-bind:class='{box: isBox}'> <button @click="count++">{{ count }}</button> <first-content></first-content> </div> `, data() { return { count: 0, isBox: true } }, components: { 'first-content': Fcontent } }; new Vue({ el: "#component-demo", // 第二種使用方式,不會將div渲染進DOM,以template為根元素 template: `<my-header></my-header>`, // 第二步,需要在根實例當中使用它 components: { 'my-header': Header } }); </script> </body> </html>
註:
1.註意寫組件標簽
2.每個組件的template只識別一個作用域塊
通信
父子組件的通信
在父組件中給子組件綁定屬性,子組件通過props=["屬性名稱"]
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../statics/vue.min.js"></script> <style> body { margin: 0; } .box { width: 100%; height: 50px; background-color: #2aabd2; } </style> </head> <body> <div id="component-demo"> </div> <script> // 定義一個局部組件,其實就是一個變數,它是一個object類型 // 屬性與全局組件是一樣的 let Fcontent = { template: ` <div> <span>這是頭條</span> {{ fdata }} </div> `, props: ['fdata'] }; let Header = { template: ` <div v-bind:class='{box: isBox}'> <button @click="count++">{{ count }}</button> <first-content :fdata="fathData"></first-content> </div> `, data() { return { count: 0, isBox: true, fathData: "我是你爸爸~~~" } }, components: { 'first-content': Fcontent } }; new Vue({ el: "#component-demo", // 第二種使用方式,不會將div渲染進DOM,以template為根元素 template: `<my-header></my-header>`, // 第二步,需要在根實例當中使用它 components: { 'my-header': Header } }); </script> </body> </html>
子父組件的通信
父組件在mounted的時候,監聽一個自定義事件。
給子組件綁定一個click事件之後,通過內建的方法$emit在父組件上觸發一個事件,這個時間就是父組件監聽的自定義事件。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../statics/vue.min.js"></script> <style> body { margin: 0; } .box { width: 100%; height: 50px; background-color: #2aabd2; } </style> </head> <body> <div id="component-demo"> </div> <script> // 定義一個局部組件,其實就是一個變數,它是一個object類型 // 屬性與全局組件是一樣的 let Fcontent = { template: ` <div> <button v-on:click="myClick">放大父組件字體</button> </div> `, methods: { myClick: