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 相关文章推荐
ext 代码生成器
Aug 07 Javascript
js的写法基础分析
Jan 17 Javascript
基于jquery的simpleValidate简易验证插件
Jan 31 Javascript
Javascript实现Array和String互转换的方法
Dec 21 Javascript
JQuery手速测试小游戏实现思路详解
Sep 20 Javascript
BootStrap table使用方法分析
Nov 08 Javascript
BootStrap Datetimepicker 汉化的实现代码
Feb 10 Javascript
js实现移动端轮播图效果
Dec 09 Javascript
angular指令笔记ng-options的使用方法
Sep 18 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
Jul 19 Javascript
JavaScript防止全局变量污染的方法总结
Aug 02 Javascript
vue 源码解析之虚拟Dom-render
Aug 26 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
收音机的保养
2021/03/01 无线电
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
JavaScript中实现异步编程模式的4种方法
2014/09/24 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
Angular排序实例详解
2017/06/28 Javascript
Kindeditor单独调用多图上传实例
2017/07/31 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
jQuery实现简单评论功能
2020/08/19 jQuery
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
python学生信息管理系统(完整版)
2020/04/05 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
Python新手学习标准库模块命名
2020/05/29 Python
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
优秀体育委员自荐书
2014/01/31 职场文书
会计学生自我鉴定
2014/02/06 职场文书
税务会计岗位职责
2014/02/18 职场文书
捐助倡议书范文
2014/04/15 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
尊师重教演讲稿
2014/09/04 职场文书
标准离婚协议书范文下载
2014/11/30 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
志愿服务心得体会
2016/01/15 职场文书
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android
python 进阶学习之python装饰器小结
2021/09/04 Python
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫