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 05 Javascript
jQuery遍历之next()、nextAll()方法使用实例
Nov 08 Javascript
jQuery.holdReady()方法用法实例
Dec 27 Javascript
推荐5 个常用的JavaScript调试技巧
Jan 08 Javascript
jQuery实现的输入框选择时间插件用法实例
Feb 28 Javascript
JQuery跳出each循环的方法
Apr 16 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
Aug 25 Javascript
详解js前端代码异常监控
Jan 11 Javascript
Vue-cli@3.0 插件系统简析
Sep 05 Javascript
VUE路由动态加载实例代码讲解
Aug 26 Javascript
基于canvas实现手写签名(vue)
May 21 Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
Nov 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
十天学会php之第八天
2006/10/09 PHP
处理php自动反斜杠的函数代码
2010/01/05 PHP
PHP在线生成二维码代码(google api)
2013/06/03 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
JavaScript While 循环基础教程
2007/04/05 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
原生JavaScript生成GUID的实现示例
2014/09/05 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
2015/11/25 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
Angularjs实现下拉框联动的示例代码
2017/08/22 Javascript
koa-router源码学习小结
2018/09/07 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
vue.js iview打包上线后字体图标不显示解决办法
2020/01/20 Javascript
vue实现的封装全局filter并统一管理操作示例
2020/02/02 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
Python实现可自定义大小的截屏功能
2018/01/20 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
Python爬取12306车次信息代码详解
2020/08/12 Python
详解Python遍历列表时删除元素的正确做法
2021/01/07 Python
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
公司中秋节活动方案
2014/02/12 职场文书
岗位竞聘演讲稿范文
2014/04/24 职场文书
优秀团干部个人事迹
2014/05/29 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
婚宴父母致辞
2015/07/27 职场文书
小学班主任工作随笔
2015/08/15 职场文书