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事件模型代码
Jul 01 Javascript
用js实现trim()的解决办法
Apr 16 Javascript
删除select中所有option选项jquery代码
Aug 12 Javascript
javascript时间函数大全
Jun 30 Javascript
js鼠标悬浮出现遮罩层的方法
Jan 28 Javascript
AngularJS手动表单验证
Feb 01 Javascript
jQuery中ScrollTo用法示例
Sep 04 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
Jul 19 Javascript
three.js中3D视野的缩放实现代码
Nov 16 Javascript
vue瀑布流组件实现上拉加载更多
Mar 10 Javascript
JavaScript或jQuery 获取option value值方法解析
May 12 jQuery
利用JavaScript模拟京东按键输入功能
Dec 01 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中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
php文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
JS实现self的resend
2010/07/22 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
jQuery的extend方法【三种】
2016/12/14 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
python命令行参数sys.argv使用示例
2014/01/28 Python
python 连接sqlite及简单操作
2017/06/30 Python
Python爬虫中urllib库的进阶学习
2018/01/05 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
Python 互换字典的键值对实例
2019/02/12 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
使用Python轻松完成垃圾分类(基于图像识别)
2019/07/09 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
Python过滤序列元素的方法
2020/07/31 Python
python3代码中实现加法重载的实例
2020/12/03 Python
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
电信营业员自我评价分享
2014/01/17 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
平安家庭事迹材料
2014/12/20 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang