在vue中如何实现购物车checkbox的三级联动

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

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

主要思路分为以下3步:

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

 1 shops: [
 2     {
 3         index: 1,
 4         brand: '鲜绿水果',
 5         title: '旗舰店',
 6         // 购物车中每个店铺的商品列表
 7         products: [
 8             {
 9                 id: 2,
10                 num: 1,
11                 isSelected: true,
12             },
13             {
14                 id: 5,
15                 num: 2,
16                 isSelected: true,
17             },
18         ],
19     },
20     {
21         index: 2,
22         brand: '鲜活之道',
23         title: '自营店',
24         products: [
25             {
26                 id: 12,
27                 num: 1,
28                 isSelected: false,
29             },
30             {
31                 id: 15,
32                 num: 2,
33                 isSelected: false,
34             },
35         ],
36     },
37 ]

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

 1  // 购物车中的商品是否全选
 2 isSelectedAll: {
 3     get () {
 4         for (var i = 0; i < this.shops.length; i++) {
 5             if (!this.isShopSelectedAll[i]) {
 6                 return false;
 7             }
 8             }
 9             return true;
10     },
11     // 这里要加一个空的setter,因为用v-model绑定时会报错
12     set () {},
13 },
14 // 店铺中的商品是否全选
15 isShopSelectedAll: function () {
16     var tempArr = [];
17     for (var i = 0; i < this.shops.length; i++) {
18         tempArr[i] = true;
19         var products = this.shops[i].products;
20         for (var j = 0; j < products.length; j++) {
21             if (!products[j].isSelected) {
22                 tempArr[i] = false;
23                 break;
24             }
25         }
26     }
27     return tempArr;
28 },

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

 1 // 全选购物车或者单个店家
 2 selectAll: function (all) {
 3     // 参数all可传入shops数组或者shops数组内的一个对象
 4     // all传入shops数组表示购物车中商品全选
 5     // all传入一个对象表示某个店铺中商品全选
 6     if (all instanceof Array) {
 7         var bool = !this.isSelectedAll;
 8         // var bool = false;
 9         for (var i = 0; i < all.length; i++) {
10             var products = all[i].products;
11             for (var j = 0; j < products.length; j++) {
12                 products[j].isSelected = bool;
13             }
14         }
15     } else {
16         var index = this.shops.indexOf(all);
17         var bool = !this.isShopSelectedAll[index];
18         for (var i = 0; i < all.products.length; i++) {
19             all.products[i].isSelected = bool;
20         }
21     }
22 },

 

这样,就可以实现购物车中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

 

posted @ 2019-04-21 14:07  Yuan-yiming  阅读(3817)  评论(2编辑  收藏  举报