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 对话框和状态栏使用说明
Oct 25 Javascript
使用js在页面中绘制表格核心代码
Sep 16 Javascript
javascript date格式化示例
Sep 25 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
Dec 27 Javascript
JQuery中DOM加载与事件执行实例分析
Jun 13 Javascript
js密码强度校验
Nov 10 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
Sep 05 Javascript
BootStrap 弹出层代码
Feb 09 Javascript
jQuery中map函数的两种方式
Apr 07 jQuery
前端构建工具之gulp的语法教程
Jun 12 Javascript
基于javascript canvas实现五子棋游戏
Jul 08 Javascript
微信小程序实现登录注册功能
Dec 29 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
用函数读出数据表内容放入二维数组
2006/10/09 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
使用WAMP搭建PHP本地开发环境
2017/05/10 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
javascript removeChild 使用注意事项
2009/04/11 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
关于redux-saga中take使用方法详解
2018/02/27 Javascript
React 路由懒加载的几种实现方案
2018/10/23 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
jQuery实现的隔行变色功能【案例】
2019/02/18 jQuery
基于ssm框架实现layui分页效果
2019/07/27 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
[01:27:43]VGJ.S vs TNC Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
[48:00]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第二场 11.04
2020/11/04 DOTA
Python中实现单例模式的n种方式和原理
2018/11/14 Python
python新式类和经典类的区别实例分析
2020/03/23 Python
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
购买一个高级域名:BuyDomains
2018/03/11 全球购物
俄罗斯三星品牌商店:Samsungstore
2020/04/05 全球购物
个人素质的自我评价分享
2013/12/16 职场文书
国贸专业自荐信范文
2014/03/02 职场文书
安全生产责任书范本
2014/04/15 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
建筑节能汇报材料
2014/08/22 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS