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 相关文章推荐
Javascript this关键字使用分析
Oct 21 Javascript
js去除重复字符串两种实现方法
Jan 09 Javascript
jsPDF生成pdf后在网页展示实例
Jan 16 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
Mar 25 Javascript
JavaScript事件委托的技术原理探讨示例
Apr 17 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
Jul 01 Javascript
js改变html的原有内容实现方法
Oct 05 Javascript
Javascript创建类和对象详解
May 31 Javascript
element-ui upload组件多文件上传的示例代码
Oct 17 Javascript
Vue实现简易翻页效果源码分享
Nov 08 Javascript
Node.js+ELK日志规范的实现
May 23 Javascript
浅谈如何优雅处理JavaScript异步错误
Nov 12 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
php下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
php空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
php检查页面是否被百度收录
2015/10/28 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
简单的JS多重继承示例
2008/03/13 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
深入探寻seajs的模块化与加载方式
2015/04/14 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
web页面和微信小程序页面实现瀑布流效果
2018/09/26 Javascript
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
JS前后端实现身份证号验证代码解析
2020/07/23 Javascript
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
深入源码解析Python中的对象与类型
2015/12/11 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
Tensorflow 实现释放内存
2020/02/03 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
师范应届生求职信
2013/11/15 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
python基础详解之if循环语句
2021/04/24 Python
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js