Vue.js2.0基礎:組件(五)

組件是我們人爲地把頁面合理地拆分成一個個區塊,讓這些區塊更方便我們重複使用,有了組件,我們可以更高效合理地開發和維護我們的項目。

規劃組件

假設我們頁面上有這樣的一個佈局:

上圖是我們模仿微信公衆號的“歷史消息”的界面,我們看到的是一個文章的目錄列表,在我們公衆號,則看到的是我們《Vue2.0基礎》的系列文章。

這種情況下,我們把每一個文章標題區塊看作一個組件來進行規劃,這樣就方便我們去複用這個組件:

實現組件

我們學會了如何規劃出一個組件,接下來,我們看看在vue中如何實現一個組件。

 

(這一部分看作一個組件)

 

我們用傳統的實現方式一個組件,html代碼如下:

 <div class="unit">
    <div class="content">
        <h1>這裏是文章的標題</h1>
        <div class="info">
            <span>2017年4月10日</span>
            <span class="original">原創</span>
        </div>
    </div>
    <img src="cover.jpg" alt="">
 </div>

忽略css(這裏我們不介紹css),我們看到了上面html代碼結構,class爲unit的<div>容器以及它的子孫節點組成了我們的組件。在vue組件中,這些代碼將作爲我們組件的模板template。

什麼意思?我們來看看vue如何實現一個組件的。

 

首先,我們還是先創建一個vue實例,很熟練了,沒難度。

 <div id="app"></div>
 <script>
    let vm = new Vue({
       el:"#app",
    });
 </script>

成功創建了一個vue實例vm,掛載元素爲id爲app的div節點。

接下來,我們在創建實例vm之前,利用vue提供的API來註冊一個組件。稍微修改一下上面的代碼:

 <div id="app"></div>
 <script>
    Vue.component('my-article',{
       template:`<div>
                <div>
                <h1>這裏是文章的標題</h1>
                <div>
                <span>2017年4月10日</span>
                <span>原創</span>
                </div>
                </div>
                <img src="cover.jpg" alt="">
                </div>`
    });

    let vm = new Vue({
       el:"#app",
    });
 </script>

我們使用了vue提供的全局API   Vue.component() ,註冊了一個名爲:“my-article”的組件,而組件的template正好是我們上面的html代碼,這樣,我們就可以用 <my-article></ my-article> 的方式來使用我們的組件。

注意:一定要確保實例vm在創建之前, <my-article> 組件已經被成功註冊,這也是爲什麼我們要把代碼寫在實例化之前。

既然註冊了組件 <my-article> ,我們就來使用這個自定義的組件:

 <div id="app">
    <my-article></my-article>
 </div>

我們看看渲染的結果:

我們看到最終渲染的不是標籤<my-article></my-article>,而是我們組件的模板template的值。我們成功地註冊一個自定義的組件並使用它。

但這並不夠,我們有的文章目錄中不僅僅只有一篇文章,而且每篇文章的標題和日期都不一樣,我們如何動態地展示它們的數據呢?

這裏就涉及到了組件的傳參props,沒錯,不但函數可以接受參數,vue的組件也可以。接下來,我們看看怎麼實現傳參。

我們知道,組件中的這4部分是需要動態獲取數據的:標題,發佈日期,是否原創,文章封面圖。

那麼,我們就通過傳參的方式把這些數據傳到組件,實現數據動態展示。

首先,我們把數據存儲在實例vm的data中:

 let vm = new Vue({
   el:"#app",
   data:{
       article:{
           title:"第一節:Vue.js框架是什麼,
爲什麼選擇它?",
           date:" 2017年03月06日",
           is_original:true,
           cover_url:"cover.jpg"
       }
   }
 });

我們給data增加了一個文章article的信息,包括:標題title,發佈日期date,是否原創is_original,封面圖片cover_url。

文章的信息有了,我們怎麼傳到組件中去呢?

 <div id="app">    
  <my-article :detail="article"></my-article>
 </div>

就像一個函數傳參一樣,你可以把detail理解成一個形參,article相當於實參。

我們給組件傳了參,組件內部怎麼接受並使用呢?我們接着看,十分簡單!

我們把註冊組件的代碼稍微修改一下:

 Vue.component('my-article',{
   props:['detail'],
   template:`<div>
            <div>
            <h1>{{detail.title}}</h1>
            <div>
            <span>{{detail.date}}</span>
            <span v-show="detail.is_original">原創</span>
            </div>
            </div>
            <img :src="detail.cover_url" alt="">
            </div>`
 });

除了template以外,我們增加了props,通過它來接受我們的參數detail,傳進來之後,你可以在組件的模板template中使用它所接受的所有數據了。比如,我們傳進來的數據包含着文章的信息:title,date,is_original,cover_url。

讀取文章的標題:

<h1>{{detail.title}}</h1>

讀取文章的發佈日期:

 <span>{{detail.date}}</span>

讀取文章是否原創,並通過 v-show 指令控制顯示/隱藏:

 <span v-show="detail.is_original">原創</span>

讀取文章的封面圖片地址:

 <img :src="detail.cover_url">

竟然讀取了數據,我們就看看渲染結果:

 

(數據動態讀取)

數據是動態讀取了,那麼我們的目錄並不僅僅只有一篇文章,當我們數據多了之後,該用什麼方式展示出來呢?

let vm = new Vue({
   el:"#app",
   data:{
       articles:[
           {
               title:"第一節:Vue.js框架是什麼,
爲什麼選擇它?",
               date:" 2017年03月06日",
               is_original:true,
               cover_url:"cover.jpg"
           },
           {
               title:"第二節:簡易安裝 和 
快速入門Vue.js",
               date:" 2017年03月09日",
               is_original:true,
               cover_url:"cover.jpg"
           },
           {
               title:"第三節:創建一個Vue實例,
超簡單",
               date:" 2017年03月17日",
               is_original:true,
               cover_url:"cover.jpg"
           },
           {
               title:"第四節:定義一個vue實例的
4個常用選項",
               date:" 2017年03月20日",
               is_original:true,
               cover_url:"cover.jpg"
           },
       ]
   }
 });

假設我們的articles中有4篇文章的信息。

也許你已經相當到了,我們可以使用 v-for 指令,它是專門用於處理列表渲染的指令。結合我們的組件,一起來實現這個文章目錄的效果。

非常簡單,組件我們已經封裝好,我們只需要給它傳參即可,所以我們不需要改動組件的代碼。而articles是一個數組,我們用 v-for 指令對它進行遍歷即可。

我們對html代碼稍微改動一下:

 <div id="app">
    <my-article 
            v-for="item in articles" 
            :detail="item">
    </my-article>
 </div>

代碼很簡單,我們在組件上加上了 v-for 指令,並遍歷了articles。

渲染結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章