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 相关文章推荐
jQuery对象和DOM对象相互转化
Apr 24 Javascript
JS实现模仿微博发布效果实例代码
Dec 16 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
Jan 02 Javascript
JS脚本defer的作用示例介绍
Jan 02 Javascript
js、jquery图片动画、动态切换示例代码
Jun 03 Javascript
jQuery EasyUI datagrid实现本地分页的方法
Feb 13 Javascript
跟我学习JScript的Bug与内存管理
Nov 18 Javascript
jQuery实现图片上传和裁剪插件Croppie
Nov 29 Javascript
改变checkbox默认选中状态及取值的实现代码
May 26 Javascript
jQuery鼠标悬停内容动画切换效果
Apr 27 jQuery
tsconfig.json配置详解
May 17 Javascript
vue项目中全局引入1个.scss文件的问题解决
Aug 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 数组排序方法总结 推荐收藏
2010/06/30 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
php使用MySQL保存session会话的方法
2015/06/26 PHP
php实现的后台表格分页功能示例
2017/10/23 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
实例详解ECMAScript5中新增的Array方法
2016/04/05 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
总结几道关于Node.js的面试问题
2017/01/11 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
js实现飞机大战游戏
2020/08/26 Javascript
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
[01:02:54]完美世界DOTA2联赛PWL S2 FTD vs GXR 第一场 11.22
2020/11/26 DOTA
Python datetime时间格式化去掉前导0
2014/07/31 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
python实现静态web服务器
2019/09/03 Python
python实现简单颜色识别程序
2020/02/19 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5的革新 结构之美
2011/06/20 HTML / CSS
英国天然宝石首饰购买网站:Gemondo Jewellery
2018/10/23 全球购物
材料加工硕士生求职信
2013/10/10 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
解除合同协议书范本
2016/03/21 职场文书
box-shadow单边阴影的实现
2023/05/21 HTML / CSS