vue2.0实现购物车和地址选配功能

购物车案例功能:

  • 创建一个Vue实例
  • v-for渲染产品数据
  • Filter对金额和图片进行格式化
  • v-on实现产品金额的动态计算

功能比较简单,但是涉及到平时项目中常见的业务逻辑。可谓麻雀虽小,五脏俱全。

数据渲染

  1. vue-resource插件来获取后端数据(推荐使用vue-axios,官网说vue-resource已不再维护),这里用的是本地的json数据来模拟。引入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中创建vue实例,data中声明个productList:[]来渲染数据,methods中声明函数cartView()来获取数据,mounted函数来执行这个cartView(mounted函数是el中的模板html,dom渲染完成再执行)

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的写法,这里使用箭头函数,就不需要再获取父级作用域的this了。省略了var_ this = this
官网说,mounted函数应该这样使用保险一些:

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

直接打开html是一定会出问题的,因为这里使用ajax来模拟获取后台数据产生了跨域,我使用了live-server插件来热启动,在本地的服务器上查看。

过滤器

使用过滤器来美化一下价格的样式,加上¥,并保留小数点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
})

业务逻辑

  1. 商品数量的加减功能
  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个参数,第一个表示商品,第二个表示加或减

  1. 单选按钮的确认和取消

因为给的json数据里没有商品的选中和取消属性,我们就通过Vue.set来给商品注册这个属性,绑定class,如果为true,check样式就显示。并通过绑定点击事件来取反,来达到选择和取消。

 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. 全选按钮的确认和取消

这个功能我们就可以在data中注册个属性来表示。声明属性checkAll:false ,并绑定到class上,表示默认的是没有选中。绑定点击事件,传入参数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;
 }

那么,怎么通过全选达到商品也被选中的效果呢?

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

全选的时候,传入参数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默认为false,小垃圾桶图标绑定事件,删除界面v-bind:class=“{‘md-show’: delFlag}” ,md-show样式在delFlag=true的时候应用了。关闭按钮绑定点击事件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
    }

好了,到这里,购物车的一些基本功能基本上都实现了。

地址选配功能

跟购物车功能类似,或许数据,挂在到mounted函数上,这里不同的是用计算属性computed获取数组的3项,然后在dom中渲染,

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

列表选项问题,配送方式的点击选中如下实现:

 <li :class="{'check':shippingMethod == 1}" @click="shippingMethod = 1">
    <div class="name">标准配送</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>

地址列表如下实现:

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

点击此地址,将索引index赋值给currentIndex,那么cunrrentIndex==index成立时,check样式实现。
这里是很好的2种不同情况下的实现方式,在以后的项目中可能会经常遇到。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • 一、基础知识 1、创建vue实例 2、常用指令 {{}}实现数据绑定 v-model 双向数据绑定,用于input...
    飞飞廉阅读 570评论 0 0
  • Vuejs2.0购物车和地址选配学习笔记 按照慕课网的Vuejs2.0的学习视频零基础实践的一个demo如下:演示...
    fleeming阅读 358评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,517评论 18 139
  • 雨后的彩虹 于一个平常的傍晚出现 让夏天 仿若邻家女孩般 不经意间来到眼前 不甘寂寞的蝉 用一往深情的嘶鸣 竭力唤...
    遥远的星光阅读 684评论 0 4
  • 一村忆 一城雨 我不甘 我不愿一次一声一失去 我不想一梦一雨一放弃 能 绝不松手 即使失败又怎样 泪下三尺血流两步...
    愁忧情阅读 232评论 0 0