Vuejs——(13)組件——雜項

 

目錄(?)[+]vue

 

 

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

http://cn.vuejs.org/guide/components.html#u6742_u9879
web

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

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


 

 

(三十)組件——雜項服務器

①組件和v-for

簡單來講,就是組件被屢次複用;app

 

例如表格裏的某一行,又例如電商的商品櫥窗展現(單個櫥窗),均可以成爲能夠被複用的組件;異步

 

只要編寫其中一個做爲組件,而後使數據來源成爲一個數組(或對象,但我的以爲最好是數組),經過v-for的遍歷,組件的每一個實例,均可以獲取這個數組中的一項,從而生成所有的組件。ide

 

而數據傳輸,因爲複用,因此須要使用props,將遍歷結果i,和props綁定的數據綁定起來,綁定方法同普通的形式,在模板中綁定。

 

示例代碼:

 

[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="the-tr" v-for="i in items" v-bind:id="i" :index="$index"></tr>  
  10.     </table>  
  11. </div>  
  12. <script>  
  13.     var vm = new Vue({  
  14.         el: '#app',  
  15.         data: {  
  16.             items: [1, 2, 3, 4]  
  17.         },  
  18.         methods: {  
  19.             toknowchildren: function () {   //切換組件顯示  
  20.                 console.log(this.$children);  
  21.             }  
  22.         },  
  23.         components: {  
  24.             theTr: { //第一個子組件  
  25.                 template: "<tr>" +  
  26.                 "<td>{{index}}</td>" +  
  27.                 "<td>{{id}}</td>" +  
  28.                 "<td>這裏是子組件</td>" +  
  29.                 "</tr>",  
  30.                 props: ['id','index']  
  31.             }  
  32.         }  
  33.     });  
  34. </script>  

 

說明:

【1】記得將要傳遞的數據放在props裏!

 

【2】將index和索引$index綁定起來,由於索引從0開始,所以索引所在列是從0開始;id是和遍歷items的i綁定在一塊兒的,所以id從1開始。

 

【3】能夠在父組件中,經過this.$children來獲取子組件(可是比較麻煩,特別是組件多的時候,比較難定位);

 

 

 

②編寫可複用的組件:

簡單來講,一次性組件(只用在這裏,不會被複用的)跟其餘組件緊密耦合是能夠的,可是,可複用的組件應當定義一個清晰的公開接口。(否則別人怎麼用?)

 

可複用的組件,基本都是要和外部交互的,而一個組件和外部公開的交互接口有:

【1】props:容許外部環境數據傳遞給組件;

【2】事件:容許組件觸發外部環境的action,就是說經過在掛載點添加v-on指令,讓子組件的events觸發時,同時觸發父組件的methods;

【3】slot:分發,容許將父組件的內容插入到子組件的視圖結構中。

 

如代碼:

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. <div id="app">  
  2.     <p>這是第一個父組件</p>  
  3.     <widget  
  4.             :the-value="test"  
  5.             @some="todo">  
  6.         <span>【第一個父組件插入的內容】</span>  
  7.     </widget>  
  8. </div>  
  9. <div id="app2">  
  10.     <p>這是第二個父組件</p>  
  11.     <widget @some="todo">  
  12.     </widget>  
  13. </div>  
  14. <script>  
  15.     Vue.component("widget", {  
  16.         template: "<button @click='dosomething'><slot></slot>這是一個複用的組件,點擊他{{theValue}}</button>",  
  17.         methods: {  
  18.             dosomething: function () {  
  19.                 this.$emit("some");  
  20.             }  
  21.         },  
  22.         events: {  
  23.             some: function () {  
  24.                 console.log("widget click");  
  25.             }  
  26.         },  
  27.         props: ['theValue']  
  28.     })  
  29.   
  30.     var vm = new Vue({  
  31.         el: '#app',  
  32.         data: {  
  33.             test: "test"  
  34.         },  
  35.         methods: {  
  36.             todo: function () {  
  37.                 console.log("這是第一個父組件")  
  38.             }  
  39.         }  
  40.     });  
  41.     var vm_other = new Vue({  
  42.         el: '#app2',  
  43.         data: {  
  44.             name: "first"  
  45.         },  
  46.         methods: {  
  47.             todo: function () {  
  48.                 console.log("這是另一個父組件")  
  49.             }  
  50.         }  
  51.     });  
  52. </script>  

說明:

【1】在第一個父組件中使用了分發slot,使用了props來傳遞值(將test的值傳到子組件的theValue之中);

 

【2】在兩個組件中,子組件在點擊後,調用methods裏的dosomething方法,而後執行了events裏的some事件。又經過掛載點的@some=」todo」,將子組件的some事件和父組件的todo方法綁定在一塊兒。

所以,點擊子組件後,最終會執行父組件的todo方法。

 

【3】更改父組件中,被傳遞到子組件的值,會同步更改子組件的值(即兩者會數據綁定);

 

 

 

③異步組件:

按照個人理解,簡單來講,一個大型應用,他有多個組件,但有些組件無需當即加載,所以被分拆成多個組件(好比說須要當即加載的,不須要當即加載的);

 

須要當即加載的,顯然放在同一個文件中比較好(或者同一批一塊兒請求);

 

而不須要當即加載的,能夠放在其餘文件中,但須要的時候,再ajax向服務器請求;

 

這些後續請求的呢,就是異步組件;

 

作到這種異步功能的,就是Vue.js的功能——容許將組件定義爲一個工廠函數,動態解析組件的定義。

 

能夠配合webpack使用。

 

至於如何具體使用,我還不太明白,教程中寫的不清,先擱置等須要的時候來研究。

 

連接:

http://cn.vuejs.org/guide/components.html#u5F02_u6B65_u7EC4_u4EF6

 

 

 

④資源命名的約定:

簡單來講,html標籤(好比div和DIV是同樣的)和特性(好比要寫成v-on這樣的指令而不是vOn)是不區分大小寫的。

 

而資源名每每是寫成駝峯式(好比camelCase駝峯式),或者單詞首字母都大寫的形式(好比PascalCase,我不知道該怎麼稱呼這個,不過這樣寫不多的說)。

Vue.component("myTemplate", {
    //......略
})

 

Vue.js能夠自動識別這個並轉換,

<my-template></my-template>

 

以上那個模板能夠自動替換這個標籤。

 

 

 

⑤遞歸組件:

簡單來講,遞歸組件就是組件在本身裏內嵌本身的模板。

 

組件想要遞歸,須要name屬性,而Vue.component自帶name屬性。

 

大概樣子是這樣的,

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. <div id="app">  
  2.     <my-template></my-template>  
  3. </div>  
  4. <script>  
  5.     Vue.component("myTemplate", {  
  6.         template: "<p><my-template></my-template></p>"  
  7.     })  

這種是無限遞歸,確定是不行的。所以,須要控制他遞歸的層數,例如經過數據來控制遞歸,當數據爲空時,則中止遞歸。

 

示例代碼以下:

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. <ul id="app">  
  2.     <li>  
  3.         {{b}}  
  4.     </li>  
  5.     <my-template v-if="a" :a="a.a" :b="a.b"></my-template>  
  6. </ul>  
  7. <script>  
  8.     Vue.component("myTemplate", {  
  9.         template: '<ul><li>{{b}}</li><my-template v-if="a" :a="a.a" :b="a.b"></my-template></ul>',  
  10.         props: ["a", "b"]  
  11.     })  
  12.     var data = {  
  13.         a: {  
  14.             a: {  
  15.                 a: 0,  
  16.                 b: 3  
  17.             },  
  18.             b: 2  
  19.         },  
  20.         b: 1  
  21.     }  
  22.     var vm = new Vue({  
  23.         el: '#app',  
  24.         data: data,  
  25.         methods: {  
  26.             todo: function () {  
  27.                 this.test += "!";  
  28.                 console.log(this.test);  
  29.             }  
  30.         }  
  31.     });  
  32. </script>  

說明:

【1】向下傳遞時,經過props傳遞a的值和b的值,其中a的值做爲遞歸後組件的a和b的值的數據來源;

而後判斷傳遞到遞歸後的組件的a的值是否存在,若是存在則繼續遞歸;

若是a的值不存在,則中止遞歸。

 

 

 

⑥片段實例:

簡單來講,所謂片段實例,就是組件的模板不是處於一個根節點之下:

 

片段實例代碼:

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. Vue.component("myTemplate", {  
  2.     template: '<div>1</div>' +  
  3.     '<div>2</div>',  
  4. })  

非片段實例:

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. Vue.component("myTemplate", {  
  2.     template: '<div>' +  
  3.     '<div>1</div>' +  
  4.     '<div>2</div>' +  
  5.     '</div>',  
  6. })  

片段實例的如下特性被忽略:

【1】組件元素上的非流程控制指令(例如寫在掛載點上的,由父組件控制的v-show指令之類,但注意,v-if屬於流程控制指令);

 

【2】非props特性(注意,props不會被忽略,另外props是寫在掛載點上的);

 

【3】過渡(就是transition這個屬性,將被忽略);

 

更多的參照官方文檔:

http://cn.vuejs.org/guide/components.html#u7247_u65AD_u5B9E_u4F8B

 

 

 

⑦內聯模板

參照:http://cn.vuejs.org/guide/components.html#u5185_u8054_u6A21_u677F

 

反正我試了下失敗了,google也沒搜到相關的內容,┑( ̄Д  ̄)┍

 

 

————————組件的基本知識到這裏結束————————————

相關文章
相關標籤/搜索