Vue实现购物车场景下的应用


Posted in Javascript onNovember 27, 2017

本文实例为大家分享了Vue在购物车场景下的应用,供大家参考,具体内容如下

购物车场景需求:

1. 商品、店铺、购物车的选择

2. 商品删除

关键代码

测试数据

var _list = [{
 checked: false,
 goods: [{
  name: "商品1",
  price: 23,
  checked: false
 }]
}, {
 checked: false,
 goods: [{
  name: "商品2",
  price: 20,
  checked: false
 }, {
  name: "商品3",
  price: 30,
  checked: false
 }]
}];

店铺对象组成购物车数组 _list
商品对象组成店铺对象下的商品数组 goods
每个商品和店铺都有自己的 checked 字段

一. 选择商品

  • 选择商品
  • 选择店铺下的所有商品
  • 选择购物车里的所有商品

数据绑定

<body class="app">
 <input type="checkbox" v-if="list.length" v-model="checkedAll">
 <div v-for="(shopI, shop) in list" class="shop">
  <input type="checkbox" v-model="shop.checked">
  <div v-for="(goodI, good) in shop.goods" class="good">
   <input type="checkbox" v-model="good.checked">
   <span v-html="good.name"></span>
   <span v-html="good.age"></span>
  </div>
 </div>
</body>
var vue = new Vue({
 el: '.app',
 data: {
  list: _list
 }
});

监听购物车全选

computed: {
 checkedAll: function() {
  return this.checkedShopsCount == this.list.length;
 },
 checkedShopsCount: function() {
  var i = 0;
  this.list.forEach(function(item) {
   if (item.checked == true) i++;
  });
  return i;
 }
}

当店铺选择数(checkedShopsCount)等于店铺数(list.length)时,购物车全选(checkedAll)为 true
商品 & 店铺选择事件

<input type="checkbox" v-if="list.length" v-model="checkedAll" @change="setAllChecked($event)">
<div v-for="(shopI, shop) in list">
 <input type="checkbox" v-model="shop.checked" @change="setGoodChecked(shop)">
 <div v-for="(goodI, good) in shop.goods">
  <input type="checkbox" v-model="good.checked" @change="setShopChecked(good, shop)">
  <span v-html="good.name"></span>
  <span v-html="good.age"></span>
 </div>
</div>
methods: {
 setAllChecked: function(e) {
  this.list.forEach(function(shop) {
   shop.checked = e.target.checked;
   shop.goods.forEach(function(good) {
    good.checked = e.target.checked;
   });
  });
 },
 setGoodChecked: function(shop) {
  shop.goods.forEach(function(good) {
   good.checked = shop.checked;
  });
 },
 setShopChecked: function(good, shop) {
  if (!good.checked) {
   shop.checked = false;
  } else {
   // 检查店铺是否存在 checked 为 false 的商品
   shop.checked = !shop.goods.find(function(good) {
    return !good.checked;
   });
  }
 }
}

选择购物车时执行 setAllChecked,此时选择所有商品和店铺
选择店铺时执行 setGoodChecked,此时选择该店铺下所有商品
选择商品时执行 setShopChecked
    当商品 checked 为 false 时,取消选择当前店铺
    当商品 checked 为 true 时,判断当前店铺是否选择了所有商品,是则选择当前店铺,否则取消选择当前店铺

二、删除商品

<input type="button" value="删除" @click="deleteGood(shop,goodI,list,shopI)">
methods: {
 deleteGood: function(shop,goodI,list,shopI) {
  shop.goods.splice(goodI, 1);
  if (shop.goods.length==0) {
   list.splice(shopI, 1);
  }
 }
}

全部代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我的购物车</title>
<script src="vue.min.js"></script>
</head>
<body class="app">
<input type="checkbox" v-if="list.length" v-model="checkedAll" @change="setAllChecked($event)">
<div v-for="(shopI, shop) in list">
<input type="checkbox" v-model="shop.checked" @change="setGoodChecked(shop)">
<div v-for="(goodI, good) in shop.goods">
<input type="checkbox" v-model="good.checked" @change="setShopChecked(good, shop)">
<span v-html="good.name"></span>
<span v-html="good.age"></span>
<input type="button" value="删除" @click="deleteGood(shop,goodI,list,shopI)">
</div>
</div>
</body>
<script>
var _list = [{
checked: false,
goods: [{
name: "商品1",
money: 23,
checked: false
}]
}, {
checked: false,
goods: [{
name: "商品2",
money: 20,
checked: false
}, {
name: "商品3",
money: 30,
checked: false
}]
}];
var vue = new Vue({
el: '.app',
data: {
list: _list
},
computed: {
checkedAll: function() {
return this.checkedShopsCount == this.list.length;
},
checkedShopsCount: function() {
var i = 0;
this.list.forEach(function(item) {
if (item.checked == true) i++;
});
return i;
}
},
methods: {
setGoodChecked: function(shop) {
shop.goods.forEach(function(good) {
good.checked = shop.checked;
});
},
setShopChecked: function(good, shop) {
if (!good.checked) {
shop.checked = false;
} else {
shop.checked = !shop.goods.find(function(good) {
return !good.checked;
});
}
},
setAllChecked: function(e) {
this.list.forEach(function(shop) {
shop.checked = e.target.checked;
shop.goods.forEach(function(good) {
good.checked = e.target.checked;
});
});
},
deleteGood: function(shop, goodI, list, shopI) {
shop.goods.splice(goodI, 1);
if (shop.goods.length == 0) {
list.splice(shopI, 1);
}
}
}
});
</script>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS中的prototype与面向对象的实例讲解
May 22 Javascript
JS数组的常见用法实例
Feb 10 Javascript
js显示文本框提示文字的方法
May 07 Javascript
js跨域请求的5中解决方式
Jul 02 Javascript
深入理解JavaScript中的箭头函数
Jul 28 Javascript
JS实现的5级联动Select下拉选择框实例
Aug 17 Javascript
JSONObject使用方法详解
Dec 17 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
Dec 05 Javascript
bootstrap multiselect 多选功能实现方法
Jun 05 Javascript
angular ng-click防止重复提交实例
Jun 16 Javascript
jQury Ajax使用Token验证身份实例代码
Sep 22 Javascript
详解在create-react-app使用less与antd按需加载
Dec 06 Javascript
javascript字体颜色控件的开发 JS实现字体控制
Nov 27 #Javascript
vue购物车插件编写代码
Nov 27 #Javascript
Vue.js devtool插件安装后无法使用的解决办法
Nov 27 #Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
Nov 27 #Javascript
vue2实现可复用的轮播图carousel组件详解
Nov 27 #Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
Nov 27 #Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
Nov 27 #Javascript
You might like
使用apache模块rewrite_module (转)
2007/02/14 PHP
PHP实现域名whois查询的代码(数据源万网、新网)
2010/02/22 PHP
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
php魔术函数__call()用法实例分析
2015/02/13 PHP
PHP导入导出Excel代码
2015/07/07 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
实例分析javascript中的call()和apply()方法
2014/11/28 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
JS抛物线动画实例制作
2018/02/24 Javascript
node实现登录图片验证码的示例代码
2018/04/20 Javascript
AngularJS 事件发布机制
2018/08/28 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
Vue性能优化的方法
2020/07/30 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
py2exe 编译ico图标的代码
2013/03/08 Python
python的Template使用指南
2014/09/11 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
python通过配置文件共享全局变量的实例
2019/01/11 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
Python定时任务框架APScheduler原理及常用代码
2020/10/05 Python
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
2016/03/16 HTML / CSS
原料仓仓管员岗位职责
2014/07/08 职场文书
党委班子对照检查材料
2014/08/19 职场文书
毕业生实习证明
2014/09/19 职场文书
设备收款委托书范本
2014/10/02 职场文书
2016大学生党校学习心得体会
2016/01/06 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
Python实现聚类K-means算法详解
2022/07/15 Python