zoukankan      html  css  js  c++  java
  • 在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

  • 相关阅读:
    python 打包exe文件并隐藏执行CMD命令窗口
    Python时间差中seconds和total_seconds的区别 datetime模块
    python之time和datetime的常用方法
    python pylint提示信息内容
    通过修改beautifulreport文件,修改测试类、测试方法、用例描述
    python 使用第三方库tomorrow实现并发
    像Excel一样使用python进行数据分析
    appnium定位+操作方式(python)
    python-appnium
    python练手项目
  • 原文地址:https://www.cnblogs.com/yuanyiming/p/10745001.html
Copyright © 2011-2022 走看看