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 相关文章推荐
JS中confirm,alert,prompt函数使用区别分析
Apr 01 Javascript
Javascript 去除数组的重复元素
May 04 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
Sep 09 Javascript
js实现的二级横向菜单条实例
Aug 22 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
Oct 08 Javascript
jquery实现倒计时效果
Dec 14 Javascript
AngularJS获取json数据的方法详解
May 27 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
Sep 20 jQuery
微信小程序(订阅消息)功能
Oct 25 Javascript
JavaScript中继承原理与用法实例入门
May 09 Javascript
vue通过过滤器实现数据格式化
Jul 20 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 Vue.js
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
S900/ ETON E1-XM 收音机
2021/03/02 无线电
php 数组使用详解 推荐
2011/06/02 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
javascript放大镜效果的简单实现
2013/12/09 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
js发送短信倒计时的简单实现方法
2016/09/08 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
JS实现显示当前日期的实例代码
2018/07/03 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
js实现踩五彩块游戏
2020/02/08 Javascript
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
2021/02/26 Vue.js
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
[36:02]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第一局
2016/02/28 DOTA
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
基于python调用psutil模块过程解析
2019/12/20 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
python中判断文件结束符的具体方法
2020/08/04 Python
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
给护士表扬信
2014/01/19 职场文书
总经理岗位职责范本
2015/04/01 职场文书
开学第一周值周总结
2015/07/16 职场文书
python opencv通过按键采集图片源码
2021/05/20 Python
Windows Server 2019 域控制器安装图文教程
2022/04/28 Servers
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android