最近用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. 在oracle表中插入空字段和null测试

    create table testTable ( id number, name ) ) select * from testTable ,'user1') ,'') ,null) select co ...

  2. visual studio code断点调试react

    在项目配置文件   .vscode\launch.json 中添加:   "sourceMaps": true,   "skipFiles": [   &quo ...

  3. How to solve problems

    练习是为了帮助你成长 0.Don't panic! 1.What are the inputs? 2.What are the outputs? 3.Work through some example ...

  4. MFC string char cstring 类型转换

    在Unicode环境下用以下转换: CString z_strCurtTime = _T(""); // 获取当前时间 CTime z_tCurTime = CTime::GetC ...

  5. SQL Server ->> OFFSET & FETCH子句

    SQL Server 2012引入OFFSET + FETCH字句.它俩出现在SELECT .... ORDER BY ...后面.作用是告诉SQL Server在结果集中忽略前N行然后取前M行出来. ...

  6. Python学习---高阶函数的学习

    高阶函数 高阶函数:函数名可以作为参数传递输入,函数名还可以作为返回值返回 函数名可以重新赋值,因为其本身就是一个变量    函数本身就是一个对象,    函数的变量名f本身就是指向函数本身的,加上括 ...

  7. linux系统开机突然黑屏,只有光标

    以前系统都是好好的,今天开机黑屏了,只有一个光标可以看见其他东西都看不见了. 经过检查发现是磁盘满了,将不用的文件删除之后可以正常开机了.特此记录一下!!! 有人问黑屏了怎么删文件? 我采用的方法是W ...

  8. Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等

    本课主题 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 Spark Worke ...

  9. 从0开始学CentOS7(1)

    首先,先来几句简介吧.. java开发一枚,总觉得自己的技术提升缓慢... 最近看到同事有在论坛发发自己的心得什么的...我脑中晃出的灵光就是:好记性不如烂笔头,试试吧~ 好了,正式开始了..cent ...

  10. 在giuhub上演示自己的项目

    首先在github上建立项目,然后git clone; 然后切换分支到 git checkout gh-pages 最后提交代码到这个分支上,访问地址:[github用户名].github.io/[项 ...