在看vue.js实战的时候笔者留下了一道题:

1. 在当前示例基础上扩展商品列表,新增一项是否选中该商品的功能,总价变为只计算选中商品的总价,同时提供一个全选的按钮。

2. “将商品列表list改成一个二维数组来实现商品的分类,比如可分为”电子产品”,”生活用品”和”果蔬”,同类商品聚合在一起,你可能用到两次v-for。

做出来的效果是这样的:

|思路:

选中商品功能,商品需要添加一个check属性。通过查询商品的check属性判断是否被选中。

总价变为计算选中商品的总价,因此我们可以在 computed计算总价totalPrice加一步验证。商品属性check = true才计算总价。

在全选的时候把商品的check属性都遍历一遍 –> 把商品的check属性都设置为true,并把全选属性 isCheckedAll设置为true表示已经全选

当单件商品取消选中的时候要把isCheckedAll设置为fasle,表示已经取消全选。

|步骤:

  1. 收到的数据是一个二维数组,分别显示商品类别以及商品内容。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    list: [
    {
    title_name: '电子产品',
    content: [
    {
    id: 1, name: 'iPad Pro', price: 5799, count: 1, check: false,
    },
    {
    id: 2, name: 'iPhone XS ', price: 5089, count: 1, check: false,
    },
    {
    id: 3, name: 'Macbook Pro', price: 13199, count: 1, check: false,
    },
    ]
    }
    ]
  2. 购物车页面显示商品类别,名称数量以及操作。底部显示总价以及结账。

  3. 通过计算属性来显示总价。循环二维数组两次,根据是否选中情况计算总价

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    computed: {
    totalPrice: function () {
    var total = 0;
    for (var i = 0; i < this.list.length; i++) {
    var item = this.list[i];
    for (var j = 0; j < item.content.length; j++) {
    var items = item.content[j];
    if (items.check == true) {
    total += items.price * items.count;
    }
    }
    }
    this.total = total
    return total;
    }
    }
    1. 单选和全选。实现的原理与全选类似,在选中按钮中绑定checked属性,绑定check属性确定绑定状态

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      check: function (index1, index2) {
      if (this.list[index1].content[index2].check) {
      this.list[index1].content[index2].check = false;
      this.isCheckedAll = false;
      }
      else {
      this.list[index1].content[index2].check = true;
      }
      },
      checkAll: function () {
      if (this.isCheckedAll == false) {
      for (var i = 0; i < this.list.length; i++) {
      var item = this.list[i];
      for (var j = 0; j < item.content.length; j++) {
      var items = item.content[j];
      items.check = true;
      }
      }
      this.isCheckedAll = true;
      } else {
      for (var i = 0; i < this.list.length; i++) {
      var item = this.list[i];
      for (var j = 0; j < item.content.length; j++) {
      var items = item.content[j];
      items.check = false;
      }
      }
      this.isCheckedAll = false;
      }
      }

所以大致就是这样实现的啦。我把题目的代码放在这里:

https://github.com/FengZeHe/vue.jsPracticalsubject/tree/master/shoppingCar/shop_demo

评论