Vuejs——(8)Vuejs組件的定義

 

目錄(?)[+]html

 

 

本篇資料來於官方文檔:vue

http://cn.vuejs.org/guide/components.html
java

本文是在官方文檔的基礎上,更加細緻的說明,代碼更多更全。app

簡單來講,更適合新手閱讀ide


 

(二十五)組件的定義函數

①組件的做用:

【1】擴展HTML元素,封裝可重用的代碼;ui

【2】組件是自定義元素,Vuejs的編譯器能夠爲其添加特殊的功能;this

【3】某些狀況下,組件能夠是原生HTML元素的形式,以is的方式擴展。spa

 

②寫一個標準的組件:

分爲如下幾步:

【1】掛載組件的地方,須要是Vue實例所渲染的html元素,具體來講,好比上面的<div id=」app」></div>這樣的html元素及他的子節點;

 

【2】定義一個組件,用

var 變量名 = Vue.extend({template:」這裏是html的模板內容」})

這樣的形式建立,例如:

[javascript]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. //定義一個組件  
  2. var btn = Vue.extend({  
  3.     template: "<button>這是一個按鈕</button>"  
  4. })  

 

【3】將定義的組件註冊到Vue實例上,這會讓指定標籤,被組件的內容所替代。

如代碼:

[javascript]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. //註冊他到Vue實例上  
  2. Vue.component("add-button", btn);  

具體而言,每個如下這樣的標籤(在Vue的根實例範圍內的)

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. <add-button></add-button>  

會被

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. <button>這是一個按鈕</button>  

所替代。

 

【4】以上方法是全局註冊(每一個Vue實例的add-button標籤都會被咱們定義的所替代);

解決辦法是局部註冊。

 

如代碼:(這是是設置了template屬性,也能夠在沒有這個屬性的時候,在<div id=」app」></div>標籤內放置<add-button></add-button>標籤

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. <div id="app">  
  2. </div>  
  3. <script>  
  4.     //定義一個組件  
  5.     var btn = Vue.extend({  
  6.         template: "<button>這是一個按鈕</button>"  
  7.     })  
  8.   
  9.     Vue.component("add-button", btn);  
  10.   
  11.     //建立根實例,也就是說讓Vue對這個根生效  
  12.     var vm = new Vue({  
  13.         el: '#app',  
  14.         template: "<add-button></add-button>"  
  15.     });  
  16. </script>  

 

 

③局部註冊組件:

簡單來講,只對這一個Vue實例生效,具體作法是,在註冊那一步,跳過;

而後在聲明Vue實例的時候,將添加到components這個屬性中(他是一個對象,以KV形式放置)(注意,這個單詞多一個s)

如代碼:

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. <div id="app">  
  2. </div>  
  3. <script>  
  4.     //定義一個組件  
  5.     var btn = Vue.extend({  
  6.         template: "<button>這是一個按鈕</button>"  
  7.     })  
  8.   
  9.     //建立根實例,也就是說讓Vue對這個根生效  
  10.     var vm = new Vue({  
  11.         el: '#app',  
  12.         template: "<add-button></add-button>",  
  13.         components: {  
  14.             "add-button": btn  
  15.         }  
  16.     });  
  17. </script>  

 

注:

根據官方教程,這種方法(指局部註冊),也適用於其餘資源,好比指令過濾器過渡

 

 

④步驟簡化:

【1】定義組件註冊組件結合起來一步完成:

[javascript]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. //定義一個組件  
  2. Vue.component("add-button", {  
  3.     template: "<button>這是一個按鈕</button>"  
  4. });  

 

【2】局部註冊時,定義和註冊一步完成:

[javascript]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. //建立根實例,也就是說讓Vue對這個根生效  
  2. var vm = new Vue({  
  3.     el: '#app',  
  4.     template: "<add-button></add-button>",  
  5.     components: {  
  6.         "add-button": {  
  7.             template: "<button>這是一個按鈕</button>"  
  8.         }  
  9.     }  
  10. });  

 

⑤data屬性

直接給組件添加data屬性是不能夠的(無效);

 

緣由在於,假如這麼幹,那麼組件的data屬性有多是一個對象,而這個對象也有多是外部傳入的(例如先聲明一個對象,而後這個對象做爲data的值),可能致使這個組件的全部副本,都共享一個對象(那個外部傳入的),這顯然是不對的。

 

所以,data屬性應該是一個函數,而後有一個返回值,這個返回值做爲data屬性的值。

 

且這個返回值應該是一個全新的對象(即深度複製的,避免多個組件共享一個對象);

 

如代碼:

[javascript]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. var vm = new Vue({  
  2.     el: '#app',  
  3.     template: "<add-button></add-button>",  
  4.     components: {  
  5.         "add-button": {  
  6.             template: "<button>這是一個按鈕{{btn}}</button>",  
  7.             data: function () {  
  8.                 return {btn: "123"};  
  9.             }  
  10.         }  
  11.     }  
  12. });  

 

另外,假如這樣的話,btn的值是同樣的(由於他們實際上仍是共享了一個對象)

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. <div id="app">  
  2. </div>  
  3. <div id="app2">  
  4. </div>  
  5. <script>  
  6.     var obj = {btn: "123"};  
  7.     var vm = new Vue({  
  8.         el: '#app',  
  9.         template: "<add-button></add-button>",  
  10.         components: {  
  11.             "add-button": {  
  12.                 template: "<button>這是一個按鈕{{btn}}</button>",  
  13.                 data: function () {  
  14.                     return obj;  
  15.                 }  
  16.             }  
  17.         }  
  18.     });  
  19.   
  20.     obj.btn = "456";  
  21.     var vm2 = new Vue({  
  22.         el: '#app2',  
  23.         template: "<add-button></add-button>",  
  24.         components: {  
  25.             "add-button": {  
  26.                 template: "<button>這是一個按鈕{{btn}}</button>",  
  27.                 data: function () {  
  28.                     return obj;  
  29.                 }  
  30.             }  
  31.         }  
  32.     });  
  33. </script>  

 

注:

el屬性用在Vue.extend()中時,也須是一個函數。

 

 

⑥is特性:

【1】按照官方教程,一些HTML元素對什麼元素能夠放在它之中是有限制的;

簡單來講,若是我要在table標籤內複用某個組件,這個組件展開後是tr標籤,可是展開前不是,那麼就沒法正常運行(被放置在table標籤內);

 

如代碼(錯誤寫法,會渲染錯誤):

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. <div id="app">  
  2.     <table>  
  3.         <tr>  
  4.             <td>索引</td>  
  5.             <td>ID</td>  
  6.             <td>說明</td>  
  7.         </tr>  
  8.         <thetr v-for="i in items" v-bind:id="i" :index="$index"></thetr>  
  9.     </table>  
  10. </div>  
  11. <script>  
  12.     var vm = new Vue({  
  13.         el: '#app',  
  14.         data: {  
  15.             items: [1, 2, 3, 4]  
  16.         },  
  17.         methods: {  
  18.             toknowchildren: function () {   //切換組件顯示  
  19.                 console.log(this.$children);  
  20.             }  
  21.         },  
  22.         components: {  
  23.             thetr: { //第一個子組件  
  24.                 template: "<tr>" +  
  25.                 "<td>{{index}}</td>" +  
  26.                 "<td>{{id}}</td>" +  
  27.                 "<td>這裏是子組件</td>" +  
  28.                 "</tr>",  
  29.                 props: ['id', 'index']  
  30.             }  
  31.         }  
  32.     });  
  33. </script>  

 

渲染結果以下:

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. <div id="app">  
  2.     <tr><td>0</td><td>1</td><td>這裏是子組件</td></tr>  
  3.     <tr><td>1</td><td>2</td><td>這裏是子組件</td></tr>  
  4.     <tr><td>2</td><td>3</td><td>這裏是子組件</td></tr>  
  5.     <tr><td>3</td><td>4</td><td>這裏是子組件</td></tr>  
  6.     <table>  
  7.         <tbody>  
  8.         <tr>  
  9.             <td>索引</td>  
  10.             <td>ID</td>  
  11.             <td>說明</td>  
  12.         </tr>  
  13.         </tbody>  
  14.     </table>  
  15. </div>  

能夠明顯發現,內容沒有被放在table之中。

 

正確寫法以下:

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. <div id="app">  
  2.     <button @click="toknowchildren">點擊讓子組件顯示</button>  
  3.     <table>  
  4.         <tr>  
  5.             <td>索引</td>  
  6.             <td>ID</td>  
  7.             <td>說明</td>  
  8.         </tr>  
  9.         <tr is="thetr" v-for="i in items" v-bind:id="i" :index="$index"></tr>  
  10.     </table>  
  11. </div>  
相關文章
相關標籤/搜索