vue2.0實現(xiàn)購物車和地址選配功能

購物車案例功能:

  • 創(chuàng)建一個Vue實例
  • v-for渲染產(chǎn)品數(shù)據(jù)
  • Filter對金額和圖片進(jìn)行格式化
  • v-on實現(xiàn)產(chǎn)品金額的動態(tài)計算

功能比較簡單爬骤,但是涉及到平時項目中常見的業(yè)務(wù)邏輯。可謂麻雀雖小剃幌,五臟俱全。

數(shù)據(jù)渲染

  1. vue-resource插件來獲取后端數(shù)據(jù)(推薦使用vue-axios葵硕,官網(wǎng)說vue-resource已不再維護(hù))竞穷,這里用的是本地的json數(shù)據(jù)來模擬。引入vue.js 暖途,vue-resource.js卑惜, 自己的js.
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="js/lib/vue-resource.js"></script>
<script src="js/cart1.js"></script>

cart.js中創(chuàng)建vue實例,data中聲明個productList:[]來渲染數(shù)據(jù)驻售,methods中聲明函數(shù)cartView()來獲取數(shù)據(jù),mounted函數(shù)來執(zhí)行這個cartView(mounted函數(shù)是el中的模板html,dom渲染完成再執(zhí)行)

new Vue({
  el: '#app',
  data: {
    productList: []
  },
  mounted () {
    this.$nextTick(function () {
      this.cartView()
    })
  },  
  methods:{
    cartView() {
      this.$http.get('../data/cartData.json').then(res => {
        this.productList = res.data.result.list;
      })
    }
  }
})

注意我使用都是es6的寫法露久,這里使用箭頭函數(shù),就不需要再獲取父級作用域的this了欺栗。省略了var_ this = this
官網(wǎng)說毫痕,mounted函數(shù)應(yīng)該這樣使用保險一些:

mounted: function () {
  this.$nextTick(function () {
    // 代碼保證 this.$el 在 document 中
  })
}

直接打開html是一定會出問題的,因為這里使用ajax來模擬獲取后臺數(shù)據(jù)產(chǎn)生了跨域迟几,我使用了live-server插件來熱啟動消请,在本地的服務(wù)器上查看。

過濾器

使用過濾器來美化一下價格的樣式类腮,加上¥臊泰,并保留小數(shù)點2位。

  filters: {
    money(value, type) {
      return '¥' + value.toFixed(2) + type
    }
  },
<div class="item-price">{{item.productPrice | money('元')}}</div>

全局注冊過濾器可以在其它頁面引用蚜枢,局部過濾器只能在這個實例中使用

Vue.filter('money', function (value, type) {
  return '$' + value.toFixed(2) + type
})

業(yè)務(wù)邏輯

  1. 商品數(shù)量的加減功能
  changeNumber(item, way) {
      if( way < 0) {
        item.productQuantity --;
        if(item.productQuantity < 1) {
          item.productQuantity = 1
        }
      }else{
        item.productQuantity ++;     
      }
    },
<a @click="changeNumber(item,-1)">-</a>
<input type="text" value="0" disabled  v-model="item.productQuantity">
<a @click="changeNumber(item, 1)">+</a>

changeNumber接受2個參數(shù)缸逃,第一個表示商品,第二個表示加或減

  1. 單選按鈕的確認(rèn)和取消

因為給的json數(shù)據(jù)里沒有商品的選中和取消屬性厂抽,我們就通過Vue.set來給商品注冊這個屬性需频,綁定class,如果為true修肠,check樣式就顯示贺辰。并通過綁定點擊事件來取反,來達(dá)到選擇和取消。

 selectProduct(item) {
      if (typeof item.checked == 'undefined') {
        this.$set(item, 'checked', true)
      }else{
        item.checked = !item.checked
      }
    }
 <a  class="item-check-btn" :class="{'check': item.checked}" @click="selectProduct(item)">
  1. 全選按鈕的確認(rèn)和取消

這個功能我們就可以在data中注冊個屬性來表示饲化。聲明屬性checkAll:false 莽鸭,并綁定到class上,表示默認(rèn)的是沒有選中吃靠。綁定點擊事件硫眨,傳入?yún)?shù)true表示全選,此時checkAllFlag中this.checkAll = true巢块,全選生效礁阁。同理,傳入false族奢,this.checkAll = false姥闭,取消全選

<span class="item-check-btn" :class="{'check':checkAll}" @click="checkAllFlag(true)">
<a class="item-del-btn" :class="{'check':checkAll}" @click="checkAllFlag(false)" >
checkAllFlag(flag) {
      this.checkAll = flag;
 }

那么,怎么通過全選達(dá)到商品也被選中的效果呢越走?

    checkAllFlag(flag) {
      this.checkAll = flag;
      this.productList.forEach((item, index) => {
        if(typeof item.checked == 'undefined') {
          this.$set(item, 'checked', flag)
        }else{
          item.checked = flag
        }
      })
    }

全選的時候棚品,傳入?yún)?shù)true,checkAll屬性為true廊敌,同時铜跑,遍歷商品的列表,給商品注冊checked:true骡澈。取消全選同理锅纺。

  1. 總金額的計算

定義一個方法來計算總計額返回給data里的totalMoney.注意的是商品被選中的時,即item.checked為true時肋殴,totalMoney才計算囤锉。

   calcTotalMoney() {
      this.totalMoney = 0;
      this.productList.forEach((item, index) => {
        if(item.checked) {
          this.totalMoney += item.productPrice*item.productQuantity
        }
      })
    }
  1. 刪除訂單功能

data中聲明delFlag默認(rèn)為false,小垃圾桶圖標(biāo)綁定事件疼电,刪除界面v-bind:class=“{‘md-show’: delFlag}” 嚼锄,md-show樣式在delFlag=true的時候應(yīng)用了。關(guān)閉按鈕綁定點擊事件delFlag=false蔽豺,這里注意的是有一個遮罩層区丑,用v-if=“delFlag”來控制顯示和隱藏。

小垃圾桶綁定事件delConfirm(item)修陡,讓curProduct變量來保存此時的商品item沧侥。

    delConfirm(item) {
      this.delFlag = true;
      this.curProduct = item //聲明curProduct屬性來保存此時的item
    },

然后在刪除功能中,獲取這個商品item的index魄鸦,再用splice方法刪除宴杀。

    delProduct() {
      var index = this.productList.indexOf(this.curProduct)
      this.productList.splice(index, 1);
      this.delFlag = false
    }

好了,到這里拾因,購物車的一些基本功能基本上都實現(xiàn)了旺罢。

地址選配功能

跟購物車功能類似旷余,或許數(shù)據(jù),掛在到mounted函數(shù)上扁达,這里不同的是用計算屬性computed獲取數(shù)組的3項正卧,然后在dom中渲染,

   computed: {
        filterAddress: function () {
            return this.addressList.slice(0, this.limitNum) //獲取addressList的前三個
        }
    },
 <li v-for="(item,index) in filterAddress" ></li>

列表選項問題跪解,配送方式的點擊選中如下實現(xiàn):

 <li :class="{'check':shippingMethod == 1}" @click="shippingMethod = 1">
    <div class="name">標(biāo)準(zhǔn)配送</div>
    <div class="price">Free</div>
</li>
 <li :class="{'check':shippingMethod == 2}" @click="shippingMethod = 2">
    <div class="name">高級配送</div>
    <div class="price">180</div>
</li>

地址列表如下實現(xiàn):

 <li v-for="(item,index) in filterAddress"  :class="{'check': index == currentIndex}"  @click="currentIndex = index">

點擊此地址炉旷,將索引index賦值給currentIndex,那么cunrrentIndex==index成立時,check樣式實現(xiàn)叉讥。
這里是很好的2種不同情況下的實現(xiàn)方式窘行,在以后的項目中可能會經(jīng)常遇到。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末图仓,一起剝皮案震驚了整個濱河市罐盔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌救崔,老刑警劉巖翘骂,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帚豪,居然都是意外死亡,警方通過查閱死者的電腦和手機草丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門狸臣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昌执,你說我怎么就攤上這事烛亦。” “怎么了懂拾?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵煤禽,是天一觀的道長。 經(jīng)常有香客問我岖赋,道長檬果,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任唐断,我火速辦了婚禮选脊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脸甘。我一直安慰自己恳啥,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布丹诀。 她就那樣靜靜地躺著钝的,像睡著了一般翁垂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上硝桩,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天沿猜,我揣著相機與錄音,去河邊找鬼亿柑。 笑死邢疙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的望薄。 我是一名探鬼主播疟游,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痕支!你這毒婦竟也來了颁虐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤卧须,失蹤者是張志新(化名)和其女友劉穎另绩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體花嘶,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡笋籽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了椭员。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片车海。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隘击,靈堂內(nèi)的尸體忽然破棺而出侍芝,到底是詐尸還是另有隱情,我是刑警寧澤埋同,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布州叠,位于F島的核電站,受9級特大地震影響凶赁,放射性物質(zhì)發(fā)生泄漏咧栗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一哟冬、第九天 我趴在偏房一處隱蔽的房頂上張望楼熄。 院中可真熱鬧,春花似錦浩峡、人聲如沸可岂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缕粹。三九已至稚茅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間平斩,已是汗流浹背亚享。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绘面,地道東北人欺税。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像揭璃,于是被迫代替她去往敵國和親晚凿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一瘦馍、基礎(chǔ)知識 1歼秽、創(chuàng)建vue實例 2、常用指令 {{}}實現(xiàn)數(shù)據(jù)綁定 v-model 雙向數(shù)據(jù)綁定情组,用于input...
    飛飛廉閱讀 593評論 0 0
  • Vuejs2.0購物車和地址選配學(xué)習(xí)筆記 按照慕課網(wǎng)的Vuejs2.0的學(xué)習(xí)視頻零基礎(chǔ)實踐的一個demo如下:演示...
    fleeming閱讀 364評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理燥筷,服務(wù)發(fā)現(xiàn),斷路器院崇,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 雨后的彩虹 于一個平常的傍晚出現(xiàn) 讓夏天 仿若鄰家女孩般 不經(jīng)意間來到眼前 不甘寂寞的蟬 用一往深情的嘶鳴 竭力喚...
    遙遠(yuǎn)的星光閱讀 698評論 0 4
  • 一村憶 一城雨 我不甘 我不愿一次一聲一失去 我不想一夢一雨一放棄 能 絕不松手 即使失敗又怎樣 淚下三尺血流兩步...
    愁憂情閱讀 239評論 0 0