最近用vue写一个电商项目,自然就少不了要写一个购物车的相关页面,功能完整的购物车的checkbox应该是三级联动的,1级checkbox是选中购物车中所有的商品,2级checkbox是选中某个店铺下的所有商品,3级checkbox是选中单个商品,如下图:

那么,如何在vue中如何实现三级联动呢?

主要思路分为以下3步:

1.首先在购物车中的每条商品信息里(在data中定义shops>>products>>isSelected),包含一个isSelected的布尔值属性,表示单个商品是否已被选中,并且在checkbox中用v-model进行双向绑定;

 shops: [
{
index: 1,
brand: '鲜绿水果',
title: '旗舰店',
// 购物车中每个店铺的商品列表
products: [
{
id: 2,
num: 1,
isSelected: true,
},
{
id: 5,
num: 2,
isSelected: true,
},
],
},
{
index: 2,
brand: '鲜活之道',
title: '自营店',
products: [
{
id: 12,
num: 1,
isSelected: false,
},
{
id: 15,
num: 2,
isSelected: false,
},
],
},
]

2.在computed中定义isSelectedAll布尔值属性,表示商品是否被全选,另外还有一个数组isShopSelectedAll,数组中包含的布尔值表示每个店铺中的商品是否被全选,这两个属性都是根据每个商品中的isSelected的值计算出来的,且这两个值也要在各自的checkbox中进行绑定;(有一点需要注意的是,由于v-model进行绑定需要改变computed的值,默认情况下computed只有getter没有setter,所以需要在isSelectedAll中加一个空的setter,表示这个计算属性可以设置)

  // 购物车中的商品是否全选
isSelectedAll: {
get () {
for (var i = 0; i < this.shops.length; i++) {
if (!this.isShopSelectedAll[i]) {
return false;
}
}
return true;
},
// 这里要加一个空的setter,因为用v-model绑定时会报错
set () {},
},
// 店铺中的商品是否全选
isShopSelectedAll: function () {
var tempArr = [];
for (var i = 0; i < this.shops.length; i++) {
tempArr[i] = true;
var products = this.shops[i].products;
for (var j = 0; j < products.length; j++) {
if (!products[j].isSelected) {
tempArr[i] = false;
break;
}
}
}
return tempArr;
},

3.然后,定义一个方法selectAll(all),在点击1级checkbox或2级checkbox时,改变对应每条商品中的isSelected的布尔值,然后在computed中的isSelectedAll、isShopSelectedAl会自动响应;

 // 全选购物车或者单个店家
selectAll: function (all) {
// 参数all可传入shops数组或者shops数组内的一个对象
// all传入shops数组表示购物车中商品全选
// all传入一个对象表示某个店铺中商品全选
if (all instanceof Array) {
var bool = !this.isSelectedAll;
// var bool = false;
for (var i = 0; i < all.length; i++) {
var products = all[i].products;
for (var j = 0; j < products.length; j++) {
products[j].isSelected = bool;
}
}
} else {
var index = this.shops.indexOf(all);
var bool = !this.isShopSelectedAll[index];
for (var i = 0; i < all.products.length; i++) {
all.products[i].isSelected = bool;
}
}
},

这样,就可以实现购物车中checkbox的三级联动了。

体验地址:https://yuan-yiming.github.io/fresh-everyday/dist/#/user-center/shopping-cart

源码地址:https://github.com/Yuan-Yiming/fresh-everyday/blob/master/src/components/ShoppingCart.vue

在vue中如何实现购物车checkbox的三级联动的更多相关文章

  1. vue中使用radio和checkbox

    代码 <template> <div id="app"> <input type="checkbox" v-model=" ...

  2. 从QQ网站中提取的纯JS省市区三级联动

    在 http://ip.qq.com/ 的网站中有QQ自己的JS省市区三级联动 QQ是使用引用外部JS来实现三级联动的.JS如下:http://ip.qq.com/js/geo.js <!DOC ...

  3. checkbox在vue中的用法小结

    关于checkbox多选框是再常见不过的了,几乎很多地方都会用到,这两天在使用vue框架时需要用到checkbox多选功能,实在着实让我头疼,vue和原生checkbox用法不太一样,之前对于vue插 ...

  4. checkbox在vue中的用法总结

    前言 关于checkbox多选框是再常见不过的了,几乎很多地方都会用到,这两天在使用vue框架时需要用到checkbox多选功能,实在着实让我头疼,vue和原生checkbox用法不太一样, 之前对于 ...

  5. 在Vue中由后台数据循环生成多选框CheckBox时的注意事项

    多选框是一种非常常见的功能,有时候我们会根据后台返回的数据进行多选框渲染,之前做项目时遇到循环生成多选框时,v-model绑定的值会随着选中与取消改变,但页面却不会变化 的情况,后来测试了一下,发现多 ...

  6. vue中简单的小插曲

    我们现在来学习一下vue中一些简单的小东西: 首先我们必须要引入vue.js文件哦! 1.有关文本框里的checkbox js代码: new Vue({ el:"#app", da ...

  7. 浅尝 Vue 中的 computed 属性 与 watch

    对于 computed 的理解: ①.computed 用来监控自己定义的变量,该变量不在 data 里面声明,直接在 computed里面定义,然后就可以在页面上进行双向数据绑定展示出结果或者用作其 ...

  8. vue 中使用iconfont Unicode编码线上字体图标的流程

    1.打开http://www.iconfont.cn官网,搜索你想要的图标.添加字体图标到购物车,点击购物车然后添加至项目,点击确定 2.点击图标管理/我的项目,找到对应的文件,点击Unicode,然 ...

  9. Vue中的computed属性

    阅读Vue官网的过程中,对于计算属于与监听器章节的内容有点理解的不清晰:https://cn.vuejs.org/v2/guide/computed.html. 后来上网查询了资料,结合官网的说明,总 ...

随机推荐

  1. Java链接 Oracle11g R2

    菜鸟学习Oracle数据库,使用Java代码链接数据库. 首先要配置Eclipse,在新建的工程中,Package Explorer->工程名->Build path->Add ex ...

  2. JAVA程序编写入门

    在任意文件夹下创建一个文本,然后重命名,把文本后缀名改为.java.然后用eclipse打开此文件编写程序内容. public class nihao{ public static void main ...

  3. qt 创建资源文件

    我们编写的gui可能需要一些额外的资源(比如贴图用的图片),可用资源文件统一管理.以下以图片为例. 用qt creator 打开工程,为工程新建资源文件: 命名为“项目名.prc”,(此处为“cloc ...

  4. 64位Navicat Premium-11.2.7(64bit)访问64位Oracle服务器

    1 在windows 10 64位操作系统安装Navicat Premium-11.2.7(64bit). 2 在服务器安装64位的Oracle(win64_11gR2_database). 3 在h ...

  5. Python 爬虫 根据属性值关键字搜索标签

    # <div class='\"name\"'>客如云</div> company_name = soup.find_all('div',class_=re ...

  6. C++中虚继承的作用及底层实现原理

    http://blog.csdn.net/bxw1992/article/details/77726390

  7. sqlite 用法整理

    转载:http://blog.csdn.net/zhaoweixing1989/article/details/19080593 先纪录到这,以后慢慢整理. 1. 在Android下通过adb she ...

  8. July 19th 2017 Week 29th Wednesday

    Rather than envy others, it is better to speed up their own pace. 与其羡慕他人,不如加快自己的脚步. The envy of othe ...

  9. 使用NPOI进行Excel数据的导入导出

  10. 学习WebSocket一(WebSocket初识)

    Java EE 7 去年刚刚发布了JSR356规范,使得WebSocket的Java API得到了统一,Tomcat从7.0.47开始支持JSR356,这样一来写WebSocket的时候,所用的代码都 ...