vue购物车

vue实现购物车全选反选,计算价格等

vue购物车

<template>
  <div class="home">
    <table cellpadding="0" cellspacing="0">
      <thead>
        <tr>
          <td>
            <label class="label">
              <input type="checkbox" v-model="checkAll" @change="allSelect" />
              <span>全选</span>
            </label>
          </td>
          <td>商品名称</td>
          <td>商品图片</td>
          <td>商品价格</td>
          <td>商品数量</td>
        </tr>
      </thead>

      <tbody>
        <tr v-for="(item,index) in goodsList" :key="index">
          <td>
            <input
              type="checkbox"
              class="input"
              :value="item.id"
              :checked="item.is_check"
              @click="checkInput(index)"
            />
          </td>
          <td>{{item.goods_name}}</td>
          <td class="imgBox">
            <img :src="item.goods_img" alt="商品图片">
          </td>
          <td>{{item.goods_price}}</td>
          <td class="numBox">
            <span @click="delFn(index)">-</span>
            <input type="text" v-model="item.goods_num" onkeyup="value=value.replace(/[^\d]/g,'').replace(/^0{1,}/g,'')" @input="inputNumFn">
            <span @click="addFn(index)">+</span>
          </td>
        </tr>

        <tr class="lasttr">
          <td>总数量</td>
          <td class="color">{{totalNum}}</td>
          <td>总价格</td>
          <td class="color">{{totalPrice}}</td>
          <td class="jiesuanBox">
            <span>去结算</span>
          </td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      goodsList:[
        {id:1,goods_name:'娃娃菜',goods_img:'../../static/imgs/baby_cabbage.png',goods_price:5,goods_num:2,is_check:false},
        {id:2,goods_name:'大白菜',goods_img:'../../static/imgs/cabbage.png',goods_price:3,goods_num:1,is_check:false},
        {id:3,goods_name:'胡萝卜',goods_img:'../../static/imgs/carrot.png',goods_price:2,goods_num:4,is_check:false},
        {id:4,goods_name:'彩椒',goods_img:'../../static/imgs/Colored_pepper.png',goods_price:6,goods_num:6,is_check:false},
        {id:5,goods_name:'玉米',goods_img:'../../static/imgs/corn.png',goods_price:3,goods_num:2,is_check:false},
        {id:6,goods_name:'茄子',goods_img:'../../static/imgs/eggplant.png',goods_price:3,goods_num:3,is_check:false},
        {id:7,goods_name:'洋葱',goods_img:'../../static/imgs/onion.png',goods_price:3,goods_num:3,is_check:false},
        {id:8,goods_name:'南瓜',goods_img:'../../static/imgs/pumpkin.png',goods_price:7,goods_num:2,is_check:false},
        {id:9,goods_name:'紫薯',goods_img:'../../static/imgs/Purple_potato.png',goods_price:5,goods_num:8,is_check:false},
        {id:10,goods_name:'西红柿',goods_img:'../../static/imgs/tomato.png',goods_price:5,goods_num:4,is_check:false},
      ], 
      checkAll:false,
      totalNum:0,
      totalPrice:0.00,
    }
  },

  methods:{
    // 全选反选
    allSelect() {
      this.goodsList = [...this.goodsList].map(sel => {
        sel.is_check = this.checkAll
        return sel
      });
      this.getTotalNum()
      this.getTotalPrice()
    },

    // 不全选中--选中单个
    checkInput(e) {
      this.goodsList[e].is_check = !this.goodsList[e].is_check
      this.checkAll = !this.goodsList.some(sel => !sel.is_check)
      this.getTotalNum()
      this.getTotalPrice()
    },

    // 增加数量
    addFn(index){
      this.goodsList[index].goods_num += 1
      this.getTotalNum()
      this.getTotalPrice()
    },

    // 减少数量
    delFn(index){
      if (this.goodsList[index].goods_num<=1) {
        console.log('不能再减了')
        return
      } else {
        this.goodsList[index].goods_num -= 1
        this.getTotalNum()
        this.getTotalPrice()
      }
    },

    // 输入数量
    inputNumFn(){
      this.getTotalNum()
      this.getTotalPrice()
    },

    // 封装:计算总数量
    getTotalNum() {
      let zongnum = 0
      for (var i = 0; i < this.goodsList.length; i++) {
        if (this.goodsList[i].is_check) {
          zongnum += this.goodsList[i].goods_num
        }
      }
      this.totalNum = zongnum
    },

    // 封装:计算总价格
    getTotalPrice() {
      let zongjia = 0
      for (var i = 0; i < this.goodsList.length; i++) {
        if (this.goodsList[i].is_check) {
          zongjia +=this.goodsList[i].goods_price *this.goodsList[i].goods_num
        }
      }
      this.totalPrice = zongjia.toFixed(2);
    },
  },
  
};
</script>

<style scoped lang="less">
@import url('./home.less');
</style>

home.less

.home{
    height: 100%;
    box-sizing: border-box;
    padding: 20px;
    table{
        box-sizing: border-box;
        width: 60%;
        text-align: center;
        border-top: 1px solid #ccc;
        border-left: 1px solid #ccc;
        thead{
            background: #C7C763;
        }
        .lasttr{
            background: #C7C763;
        }
        td{
            height: 60px;
            border-right: 1px solid #ccc;
            border-bottom: 1px solid #ccc;
            img{
                width: 58px;
                height: 58px;
            }
            .label{
                cursor: pointer;
                input{
                    cursor: pointer;
                }
            }
            .input{
                cursor: pointer;
            }
        }
        .imgBox{
            display: flex;
            justify-content: center;
            align-items: center;
        }
        .color{
            color: #ff3333;
        }
        .numBox{
            span{
                cursor: pointer;
                background: #C7C763;
                display: inline-block;
                width: 30px;
                height: 30px;
                line-height: 30px;
            }
            input{
                width: 100px;
                margin: 0 20px;
                height: 30px;
                text-align: center;
                outline: none;
            }
        }
        .jiesuanBox{
            span{
                background: #ff3333;
                display: inline-block;
                width: 100px;
                height: 40px;
                line-height: 40px;
                border-radius: 5px;
                color: #fff;
                cursor: pointer;
            }
        }
    }
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值