Vue.js搭建移動(dòng)端購(gòu)物車界面
本文介紹了如何使用Vue搭建一個(gè)移動(dòng)端購(gòu)物車界面,最終實(shí)現(xiàn)的功能包括:
1. 選擇要最終購(gòu)買的物品
2. 選擇每件物品購(gòu)買的數(shù)量
3. 實(shí)時(shí)更新所選擇物品的總價(jià)格
HTML部分
首先給出HTML部分代碼和注釋,顯示了整個(gè)界面的結(jié)構(gòu)。
<body>
<div class="checkout">
<div id="app">
<div class="container">
<div class="cart">
<div class="checkout-title">
<span>購(gòu)物車</span>
</div>
<!-- table -->
<div class="item-list-wrap">
<divclassdivclass="cart-item">
<divclassdivclass="cart-item-head">
<ul>
<li>商品信息</li>
<li>商品金額</li>
<li>商品數(shù)量</li>
<li>總金額</li>
<li>編輯</li>
</ul>
</div>
<ulclassulclass="cart-item-list">
<!--productList在Vue組件中的data定義,包含全部數(shù)據(jù),使用v-for進(jìn)行遍歷顯示-->
<li v-for="item inproductList">
<divclassdivclass="cart-tab-1">
<divclassdivclass="cart-item-check">
<!--Vue2.0中想為HTML標(biāo)簽綁定屬性,必須使用v-bind:,綁定內(nèi)容為對(duì)象,這里為a標(biāo)簽綁定check屬性,屬性值為item中的checked值-->
<!--@click是v-on:click的縮寫,為這個(gè)按鈕綁定了點(diǎn)擊事件,對(duì)應(yīng)Vue組件methods中定義的方法selectProduct-->
<ahrefahref="javascript:void 0" class="item-check-btn"v-bind:class="{'check': item.checked}"@click="selectedProduct(item)">
<svgclasssvgclass="icon icon-ok"><usexlink:hrefusexlink:href="#icon-ok"></use></svg>
</a>
</div>
<divclassdivclass="cart-item-pic">
<imgv-bind:srcimgv-bind:src="item.productImage" alt="煙">
</div>
<divclassdivclass="cart-item-title">
<divclassdivclass="item-name">{{ item.productName }}</div>
</div>
<divclassdivclass="item-include">
<dl>
<dt>贈(zèng)送:</dt>
<ddv-forddv-for="part in item.parts"v-text="part.partsName"></dd>
</dl>
</div>
</div>
<divclassdivclass="cart-tab-2">
<!--使用過濾器,|后面加Vue組件filter中定義的過濾器名稱-->
<divclassdivclass="item-price">{{ item.productPrice |formatMoney}}</div>
</div>
<divclassdivclass="cart-tab-3">
<divclassdivclass="item-quantity">
<divclassdivclass="select-self select-self-open">
<divclassdivclass="quantity">
<!--綁定changeMoney()方法,調(diào)整商品數(shù)量-->
<ahrefahref="javascript:;"@click="changeMoney(item,-1)">-</a>
<inputtypeinputtype="text" :value="item.productQuantity" disabled>
<ahrefahref="javascript:;"@click="changeMoney(item,1)">+</a>
</div>
</div>
<divclassdivclass="item-stock">有貨</div>
</div>
</div>
<divclassdivclass="cart-tab-4">
<divclassdivclass="item-price-total">{{ item.productPrice*item.productQuantity| money('元')}}</div>
</div>
<div class="cart-tab-5">
<divclassdivclass="cart-item-operation">
<!--delConfirm方法控制刪除時(shí)的彈框顯示狀態(tài)-->
<ahrefahref="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">
<divclassdivclass="cart-foot-l">
<divclassdivclass="item-all-check">
<ahrefahref="javascript:void 0">
<spanclassspanclass="item-check-btn" :class="{'check':checkAllFlag}"@click="checkAll(true)">
<svg class="iconicon-ok"><usexlink:hrefusexlink:href="#icon-ok"></use></svg>
</span>
<span v-show="!checkAllFlag">全選</span>
</a>
</div>
<divclassdivclass="item-all-del">
<ahrefahref="javascript:void 0" class="item-del-btn"@click="checkAll(false)">
<spanv-showspanv-show="checkAllFlag">取消全選</span>
</a>
</div>
</div>
<divclassdivclass="cart-foot-r">
<divclassdivclass="item-total">
<!--totalMoney是商品總金額,在Vue組件中通過方法被修改-->
Item total: <span class="total-price">{{totalMoney| money('元')}}</span>
</div>
<divclassdivclass="next-btn-wrap">
<ahrefahref="address.html" class="btn btn--red" style="width:200px">結(jié)賬</a>
</div>
</div>
</div>
</div>
</div>
<!--綁定一個(gè)md-show類,通過delFlag變量控制這個(gè)類,這個(gè)類可以讓彈框顯示或隱藏-->
<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">
<!--關(guān)閉按鈕,通過改變delFlag值控制彈框狀態(tài)-->
<buttonclassbuttonclass="md-close" @click="delFlag = false">關(guān)閉</button>
</div>
<div class="md-content">
<divclassdivclass="confirm-tips">
<pidpid="cusLanInfo">你確認(rèn)刪除此訂單信息嗎?</p>
</div>
<div class="btn-wrapcol-2">
<!--選擇yes則調(diào)用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>
<!--遮罩層,整個(gè)都是通過delFlag進(jìn)行控制的,v-if根據(jù)表達(dá)式的真假條件渲染元素-->
<div class="md-overlay"v-if="delFlag"></div>
</div>
</div>
</body>
對(duì)應(yīng)的關(guān)鍵注釋在代碼中給出,下面結(jié)合Vue.js的代碼,對(duì)主要部分進(jìn)行解釋。
一、Vue組件基本格式
一個(gè)Vue組件的基本代碼如下:
new Vue({
el:'#app',
data: {},
filters: {},
mounted: function() {},
methods: {}
});
在JS代碼中,使用new Vue即可聲明一個(gè)Vue組件。Vue組件主要包括以下幾個(gè)字段。
1. el字段:el字段用來(lái)定義該組件在HTML中的哪個(gè)位置生效,需要傳入HTML中某個(gè)元素的id值。這里傳入了#app,表示HTML中id為app的元素內(nèi)部都是這個(gè)Vue組件的作用范圍。
2. data字段:data字段定義了Vue組件中的數(shù)據(jù),可能在HTML中進(jìn)行渲染。在本應(yīng)用中,商品的價(jià)格、名稱、圖片鏈接等信息,都是使用Vue組件中data字段內(nèi)的數(shù)據(jù)進(jìn)行渲染的。
3. filter字段:filter字段是一個(gè)過濾器,在本應(yīng)用中,針對(duì)價(jià)格等需要格式化的文本,就可以使用filter進(jìn)行過濾。
4. mounted字段:mounted字段通常定義一個(gè)方法,這個(gè)方法將在頁(yè)面加載完成時(shí)自動(dòng)執(zhí)行,在React等框架中都有類似的機(jī)制。
5. method字段:method字段用來(lái)定義Vue組件中需要用到的方法,這個(gè)字段的內(nèi)容往往是需要投入時(shí)間最多的部分,例如頁(yè)面中選擇商品、增加數(shù)量等邏輯,都是在這個(gè)字段中進(jìn)行編輯的。
以上就是一個(gè)vue組件的主要組成部分,下面對(duì)各個(gè)部分功能的代碼編寫進(jìn)行簡(jiǎn)要介紹。
二、數(shù)據(jù)渲染
數(shù)據(jù)渲染部分,要渲染的數(shù)據(jù)都存放在data中。每一個(gè)商品的信息都被模擬存儲(chǔ)在了cart.json的文件中。我們可以實(shí)現(xiàn)數(shù)據(jù)自動(dòng)加載,基本思路是:在method字段中定義一個(gè)方法,用來(lái)加載cart.json中的數(shù)據(jù),并將其存放到data字段中定義的對(duì)應(yīng)變量中。在mouted字段中,自動(dòng)調(diào)用這個(gè)方法。這樣就實(shí)現(xiàn)了頁(yè)面加載完成后自動(dòng)加載數(shù)據(jù)。對(duì)應(yīng)的JS代碼和注釋如下:
data: {
//存放商品json數(shù)據(jù)信息
productList: []
}
methods: {
//cartView()方法用來(lái)加載數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)在這個(gè)Vue組件中的productList變量中
cartView: function() {
var _this = this;
//使用vue-resource模塊加載數(shù)據(jù),類似Jquery中的AJAX,返回?cái)?shù)據(jù)存放在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() {
//執(zhí)行代碼放在$nextTick中,保證頁(yè)面結(jié)構(gòu)加載完畢后再執(zhí)行函數(shù)
this.$nextTick(function() {
this.cartView(); //使用this調(diào)用methods中定義的cartView()方法
})
}
完成了這部分代碼,所有商品的數(shù)據(jù)就存放在了組件中變量名為productList的字段中。
在前端HTML部分的進(jìn)行調(diào)用,需要使用v-for指令。這個(gè)指令用來(lái)循環(huán)遍歷Vue中的數(shù)據(jù),代碼如下:
<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>贈(zèng)送:</dt>
<dd v-for="part in item.parts"v-text="part.partsName"></dd>
</dl>
</div>
</div>
</ul>
通過v-for指令,遍歷了變量productList中的數(shù)據(jù),并在內(nèi)部的HTML中調(diào)用。利潤(rùn)item.productImage獲取對(duì)應(yīng)圖片URL地址;item.productName獲取商品名稱等。這樣,就自動(dòng)生成了一個(gè)商品信息列表。
下一部分將介紹邏輯代碼的編寫。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue+springmvc導(dǎo)出excel數(shù)據(jù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue+springmvc導(dǎo)出excel數(shù)據(jù)的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
解決router.beforeEach()動(dòng)態(tài)加載路由出現(xiàn)死循環(huán)問題
這篇文章主要介紹了解決router.beforeEach()動(dòng)態(tài)加載路由出現(xiàn)死循環(huán)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
vue動(dòng)態(tài)生成dom并且自動(dòng)綁定事件
本篇文章主要介紹了vue動(dòng)態(tài)生成dom并且自動(dòng)綁定事件,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04
詳解Vue 2中的? initState 狀態(tài)初始化
這篇文章主要介紹了詳解Vue 2中的initState狀態(tài)初始化,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
bootstrap vue.js實(shí)現(xiàn)tab效果
這篇文章主要為大家詳細(xì)介紹了bootstrap vue.js實(shí)現(xiàn)tab效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02

