1. 程式人生 > >Vue.js搭建移動端購物車介面-基本結構和資料渲染

Vue.js搭建移動端購物車介面-基本結構和資料渲染

本文介紹瞭如何使用Vue搭建一個移動端購物車介面,最終實現的功能包括:

1.        選擇要最終購買的物品

2.        選擇每件物品購買的數量

3.        實時更新所選擇物品的總價格

HTML部分

首先給出HTML部分程式碼和註釋,顯示了整個介面的結構。

<body>
   <div class="checkout">
     <div id="app">
       <div class="container">
         <div class="cart">
           <div class="checkout-title">
              <span>購物車</span>
           </div>
 
           <!-- table -->
           <div class="item-list-wrap">
              <divclass="cart-item">
                <divclass="cart-item-head">
                  <ul>
                    <li>商品資訊</li>
                    <li>商品金額</li>
                    <li>商品數量</li>
                    <li>總金額</li>
                    <li>編輯</li>
                  </ul>
                </div>
                <ulclass="cart-item-list">
                  <!--productList在Vue元件中的data定義,包含全部資料,使用v-for進行遍歷顯示-->
                  <li v-for="item inproductList">
                    <divclass="cart-tab-1">
                      <divclass="cart-item-check">
                        <!--Vue2.0中想為HTML標籤繫結屬性,必須使用v-bind:,繫結內容為物件,這裡為a標籤繫結check屬性,屬性值為item中的checked值-->
                        <
[email protected]
是v-on:click的縮寫,為這個按鈕綁定了點選事件,對應Vue元件methods中定義的方法selectProduct--> <ahref="javascript:void 0" class="item-check-btn"v-bind:class="{'check': item.checked}"@click="selectedProduct(item)"> <svgclass="icon icon-ok"><usexlink:href="#icon-ok"></use></svg> </a> </div> <divclass="cart-item-pic"> <imgv-bind:src="item.productImage" alt="煙"> </div> <divclass="cart-item-title"> <divclass="item-name">{{ item.productName }}</div> </div> <divclass="item-include"> <dl> <dt>贈送:</dt> <ddv-for="part in item.parts"v-text="part.partsName"></dd> </dl> </div> </div> <divclass="cart-tab-2"> <!--使用過濾器,|後面加Vue元件filter中定義的過濾器名稱--> <divclass="item-price">{{ item.productPrice |formatMoney}}</div> </div> <divclass="cart-tab-3"> <divclass="item-quantity"> <divclass="select-self select-self-open"> <divclass="quantity"> <!--繫結changeMoney()方法,調整商品數量--> <ahref="javascript:;"@click="changeMoney(item,-1)">-</a> <inputtype="text" :value="item.productQuantity" disabled> <ahref="javascript:;"@click="changeMoney(item,1)">+</a> </div> </div> <divclass="item-stock">有貨</div> </div> </div> <divclass="cart-tab-4"> <divclass="item-price-total">{{ item.productPrice*item.productQuantity| money('元')}}</div> </div> <div class="cart-tab-5"> <divclass="cart-item-operation"> <!--delConfirm方法控制刪除時的彈框顯示狀態--> <ahref="javascript:void 0" class="item-edit-btn"@click="delConfirm(item)"> <svg class="iconicon-del"><use xlink:href="#icon-del"></use></svg> </a> </div> </div> </li> </ul> </div> </div> <!-- footer --> <div class="cart-foot-wrap"> <divclass="cart-foot-l"> <divclass="item-all-check"> <ahref="javascript:void 0"> <spanclass="item-check-btn" :class="{'check':checkAllFlag}"@click="checkAll(true)"> <svg class="iconicon-ok"><usexlink:href="#icon-ok"></use></svg> </span> <span v-show="!checkAllFlag">全選</span> </a> </div> <divclass="item-all-del"> <ahref="javascript:void 0" class="item-del-btn"@click="checkAll(false)"> <spanv-show="checkAllFlag">取消全選</span> </a> </div> </div> <divclass="cart-foot-r"> <divclass="item-total"> <!--totalMoney是商品總金額,在Vue元件中通過方法被修改--> Item total: <span class="total-price">{{totalMoney| money('元')}}</span> </div> <divclass="next-btn-wrap"> <ahref="address.html" class="btn btn--red" style="width:200px">結賬</a> </div> </div> </div> </div> </div> <!--繫結一個md-show類,通過delFlag變數控制這個類,這個類可以讓彈框顯示或隱藏--> <div class="md-modal modal-msg md-modal-transition"id="showModal" v-bind:class="{'md-show':delFlag}"> <div class="md-modal-inner"> <div class="md-top"> <!--關閉按鈕,通過改變delFlag值控制彈框狀態--> <buttonclass="md-close" @click="delFlag = false">關閉</button> </div> <div class="md-content"> <divclass="confirm-tips"> <pid="cusLanInfo">你確認刪除此訂單資訊嗎?</p> </div> <div class="btn-wrapcol-2"> <!--選擇yes則呼叫delProduct刪除元素--> <button class="btnbtn--m" id="btnModalConfirm"@click="delProduct">Yes</button> <button class="btnbtn--m btn--red" id="btnModalCancel"@click="delFlag=false">No</button> </div> </div> </div> </div> <!--遮罩層,整個都是通過delFlag進行控制的,v-if根據表示式的真假條件渲染元素--> <div class="md-overlay"v-if="delFlag"></div> </div> </div> </body>

對應的關鍵註釋在程式碼中給出,下面結合Vue.js的程式碼,對主要部分進行解釋。

一、Vue元件基本格式

一個Vue元件的基本程式碼如下:

new Vue({
  el:'#app',
 data: {},
 filters: {},
 mounted: function() {},
 methods: {}
});

在JS程式碼中,使用new Vue即可宣告一個Vue元件。Vue元件主要包括以下幾個欄位。

1.  el欄位:el欄位用來定義該元件在HTML中的哪個位置生效,需要傳入HTML中某個元素的id值。這裡傳入了#app,表示HTML中id為app的元素內部都是這個Vue元件的作用範圍。

2. data欄位:data欄位定義了Vue元件中的資料,可能在HTML中進行渲染。在本應用中,商品的價格、名稱、圖片連結等資訊,都是使用Vue元件中data欄位內的資料進行渲染的。

3. filter欄位:filter欄位是一個過濾器,在本應用中,針對價格等需要格式化的文字,就可以使用filter進行過濾。

4. mounted欄位:mounted欄位通常定義一個方法,這個方法將在頁面載入完成時自動執行,在React等框架中都有類似的機制。

5. method欄位:method欄位用來定義Vue元件中需要用到的方法,這個欄位的內容往往是需要投入時間最多的部分,例如頁面中選擇商品、增加數量等邏輯,都是在這個欄位中進行編輯的。

以上就是一個vue元件的主要組成部分,下面對各個部分功能的程式碼編寫進行簡要介紹。

二、資料渲染

資料渲染部分,要渲染的資料都存放在data中。每一個商品的資訊都被模擬儲存在了cart.json的檔案中。我們可以實現資料自動載入,基本思路是:在method欄位中定義一個方法,用來載入cart.json中的資料,並將其存放到data欄位中定義的對應變數中。在mouted欄位中,自動呼叫這個方法。這樣就實現了頁面載入完成後自動載入資料。對應的JS程式碼和註釋如下:

data: {
   //存放商品json資料資訊
   productList: []
  }
methods: {
     //cartView()方法用來載入資料,並將資料儲存在這個Vue元件中的productList變數中
     cartView: function() {
       var _this = this;
       //使用vue-resource模組載入資料,類似Jquery中的AJAX,返回資料存放在res.body中
       this.$http.get("data/cartData.json", {"id":123}).then(function(res) {
          _this.productList =res.body.result.list;
         // _this.totalMoney = res.body.result.totalMoney;
       });
}
 }
 mounted: function() {  
   //執行程式碼放在$nextTick中,保證頁面結構載入完畢後再執行函式
   this.$nextTick(function() {
     this.cartView();    //使用this呼叫methods中定義的cartView()方法
   })
  }

完成了這部分程式碼,所有商品的資料就存放在了元件中變數名為productList的欄位中。

在前端HTML部分的進行呼叫,需要使用v-for指令。這個指令用來迴圈遍歷Vue中的資料,程式碼如下:

<ul class="cart-item-list">
 <li v-for="item in productList">
   <div class="cart-tab-1">
     <div class="cart-item-check">
     </div>
     <div class="cart-item-pic">
       <img v-bind:src="item.productImage" alt="煙">
     </div>
     <div class="cart-item-title">
       <div class="item-name">{{ item.productName}}</div>
     </div>
     <div class="item-include">
       <dl>
         <dt>贈送:</dt>
         <dd v-for="part in item.parts"v-text="part.partsName"></dd>
       </dl>
     </div>
   </div>
</ul>

通過v-for指令,遍歷了變數productList中的資料,並在內部的HTML中呼叫。利潤item.productImage獲取對應圖片URL地址;item.productName獲取商品名稱等。這樣,就自動生成了一個商品資訊列表。

下一部分將介紹邏輯程式碼的編寫