小白初學Vue之 組件與實例的關系 初試篇


內容:組件和實例

一、組件和實例的關系

先看下之前的代碼,來看下整體的架構

 1 <!DOCTYPE html>
 2 <html>
 3 
 4  <head>
 5   <meta charset="UTF-8">
 6   <title>拆分組件</title>
 7   <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
 8  </head>
 9  <style>
10  button {
11  background: blue;
12  height: 32px;
13  width: 120px;
14  border: 1px solid blue;
15  color: #FFFFFF;
16  margin-top: 20px;
17  font-size: 14px;
18   }
19  </style>
20 
21  <body>
22    <div id="root">
23      <input type="text" name="" id="" v-model="msg" />
24      <button @click="add">添加</button>
25      <!--list顯示-->
26      <ul>
27         <li-cell v-for="(item ,index) of list" :key="index" :content="item"></li-cell>
28      </ul>
29 
30     </div>
31     <script type="text/javascript">
32      // 全局組件
33  Vue.component('li-cell', { 34  props: ['content'], // 添加content屬性后
35  template: "<li>{{content}}</li>" // 添加content屬性后
36  }); 37      new Vue({ 38  el: "#root", 39  data: { 40  msg: "", 41  list: [], 42  }, 43  methods: { 44  add: function() { 45            this.list.push(this.msg); 46            this.msg = ""; 47  } 48  } 49  }); 50   </script>
51  </body>
52 
53 </html>

先看下整體結構 :

我們先看下最外層的這個Vue實例。它的掛載點是在id為root的div ,而這個div內的內容就是這個實例的模板我們可以這樣認為。

再看下我們創建的組件,你可以嘗試把實例中的相關屬性都在添加下再你創建的組件中測試下,你會發現“組件其實就是實例”。即你可以在你創建的組件中添加data、methods..等屬性。


 

二、父組件與子組件之前的交互 

示例:刪除功能

 1 <!DOCTYPE html>
 2 <html>
 3 
 4  <head>
 5   <meta charset="UTF-8">
 6   <title>通過簡單的刪除功能來理解父組件與子組件之間的數據傳遞</title>
 7   <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
 8  </head>
 9  <style type="text/css">
10  button {
11  font-size: 14px;
12  background: skyblue;
13  border: 1px solid skyblue;
14  width: 100px;
15  height: 30px;
16  border-radius: 4px;
17   }
18  </style>
19 
20  <body>
21   <!--實現效果點擊li刪除-->
22   <div id="root">
23    <input type="text" v-model="msg" />
24    <button @click="add">添加</button>
25    <ul>
26     <itme-cell v-for="(item,index) of list" :key="index" :index="index" :content="item" @delete="handle"></itme-cell>
27    </ul>
28   </div>
29   <script>
30   // 一般的刪除思路:點擊li,找到當前li的父級ul,進行刪除;
31  
32   // 該組件是子組件
33  Vue.component('itme-cell',{ 34  props:['content','index'] ,// 接受父組件傳遞過來的索引index
35  template:'<li @click="deleteLi">{{content}}</li>',// 我們先給li綁定刪除事件
36  methods:{// 當li被點擊時,會觸發deleteLi
37  deleteLi:function(){ 38 // alert(this.index);
39       this.$emit('delete',this.index);// 此處表示向外觸發刪除事件,即父組件中的delete事件,並同時把索引傳遞給父組件。從而讓父組件去執行handle 的方法;
40  } 41  } 42  }); 43    
44   // 最外層的vue實例是父組件
45    new Vue({ 46  el: '#root', 47  data: { 48  msg: "", 49  list: [] 50  }, 51  methods:{ 52  add:function(){// 當添加按鈕別點擊時會觸發該add方法
53       this.list.push(this.msg); // 因為input值與實例中data的msg變量進行了雙向綁定,所以此處的意思就是:只要點擊添加按鈕,就會獲取input中的值,並把這個值添加到list數組中。然后現在是list數據已經存在了,就在模板中調用v-for對數據進行循環加載即可
54       this.msg="";// 每次添加完成都會清空下input中的值
55  }, 56  handle:function(){ 57        // 把數據移除注意此處一定要是this.index,否則會報錯 ..index not defined.. 
58       this.list.splice(this.index,1);// splice(索引,要移除的個數); 
59       //我自己寫的時候其實是有疑問的,一般的開發我們刪除數據之后還要把當前的dom也在頁面中移除掉。但是為什么此處不用呢?我現在只知道這個方法是vue更改后的,如果調用刪除數組元素的方法vue就會自動更新視圖,這塊我還是不清楚,有知道望解惑下!
60  } 61  } 62  }); 63   </script>
64  </body>
65 
66 </html>

通過上述代碼可以得出:

1.最外層的Vue實例是父組件,Vue.component是子組件;

2.父組件---->子組件:

用上述代碼來舉例,父組件中的模板把content與index屬性傳遞給子組件,子組件用props來接收2個屬性;

3.點擊子組件中的模板觸發事件時,使用 this.$emit('delete',this.index);通知父組件觸發delete事件並同時把index傳遞給父組件。

4.代碼中“this.list.splice(this.index,1)”這個splice()是vue改寫過的方法,調用后vue視圖會自動更新。

 


 

感謝瀏覽至此,目前我也只是明白的它的意思,但是具體的還要深入了解,目前只能是了解階段,皮毛都不算。有不對的地方,望指出,共提升,多謝~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM