Vue购物车全选、反选——单选全部选中全选自动选中以及总价计算

1、模拟购物车数据

data() {
    return {
      //模拟购物车数据arr
      arr:[
        {
          ischeck:false, //默认为false
          name:'篮球',
          price:98
        },
        {
          ischeck:false, //默认为false
          name:'足球',
          price:10
        },
        {
          ischeck:false, //默认为false
          name:'羽毛球',
          price:5
        },
        {
          ischeck:false, //默认为false
          name:'排球',
          price:100
        }
      ]
    };
  },

2、渲染购物车页面

<template>
  <div>
    <!-- 购物车数据渲染 -->
    <div v-for="(item,index) in arr" :key="index">
      <p>
        <input type="checkbox" v-model="item.ischeck">
        {{item.name}}  -------价格:{{item.price}}</p>
    </div>
    <!-- 底部 -->
    <div class="footer">
      <input type="checkbox">全选---
    </div>
  </div>
</template>

3、判断数据中ischeck(单选框)的状态,如果都是true,那么全选就一定true

<!-- html -->

<template>
  <div>
    <!-- 购物车数据渲染 -->
    <div v-for="(item,index) in arr" :key="index">
      <p>
        <input type="checkbox" v-model="item.ischeck" @click="changeOne(index)">
        {{item.name}}  -------价格:{{item.price}}</p>
    </div>
    <!-- 底部 -->
    <div class="footer">
      <input type="checkbox" v-model="allcheck">全选---
    </div>
  </div>
</template>
//js

data() {
    return {
      //模拟购物车数据arr
      arr:[
        {
          ischeck:false, //默认为false
          name:'篮球',
          price:98
        },
        {
          ischeck:false, //默认为false
          name:'足球',
          price:10
        },
        {
          ischeck:false, //默认为false
          name:'羽毛球',
          price:5
        },
        {
          ischeck:false, //默认为false
          name:'排球',
          price:100
        }
      ],
      allcheck:false,
    };
  },
methods: {
    //判断全选框是否选中
    all(){
      let _index=this.arr.findIndex(item=>{
        return !item.ischeck
      })
      if(_index==-1){
        this.allcheck=true
      }else{
        this.allcheck=false
      }
    },
    //点击购物车数据中单选框改变ischeck事件
    changeOne(index){
      this.arr[index].ischeck=!this.arr[index].ischeck
    //调用判断
      this.all()
    }
  }, 

4、点击全选按钮,查看allcheck的布尔值是否正确,对购物车数据循环遍历,让数据中的每一项ischeck的值跟着全选变化

//html
<input type="checkbox" v-model="allcheck" @click="changeAll">全选---


//js
changeAll(){
      //取反
      this.allcheck=!this.allcheck
      // 遍历数组arr
      this.arr.forEach(item=>{
        return item.ischeck=this.allcheck
      })
    }

5、全选单选功能就实现了,接着封装一个计算总价的事件方便调用,防止代码频繁重复

//html
<input type="checkbox" v-model="allcheck">全选---总价{{allp}}


//js
//计算总价
    allprice(){
      let _price=0
      //循环数组
      this.arr.forEach(item=>{
        //计算单选框选中状态下的总价
        if(item.ischeck){
          _price+=item.price
        }
        this.allp=_price
      })
    },

6、修改数据时(比如添加新数据,或改变数据的ischeck)需要同步更新,所以在添加数据事件、单选事件,全选事件......调用这个计算函数重新计算更新即可

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Vue 中,可以使用 `v-model` 指令绑定数据,通过 `v-for` 指令循环渲染出购物车列表中每个商品的复框。可以用一个变量 `checkedAll` 来记录是否全选,当其中一个复框被选中或取消选中时,都要检查是否所有的复框都被选中,以确定是否需要将 `checkedAll` 设置为 `true` 或 `false`。当点击全选按钮时,则将所有复框的状态设置为 `checkedAll`。 以下是一个简的实现示例: ```html <template> <div> <div> <input type="checkbox" v-model="checkedAll" @change="checkAll"> <label>全选</label> </div> <div v-for="(item, index) in cartList" :key="index"> <input type="checkbox" v-model="item.checked" @change="checkOne"> <label>{{ item.name }}</label> </div> </div> </template> <script> export default { data() { return { cartList: [ { name: '商品1', checked: false }, { name: '商品2', checked: false }, { name: '商品3', checked: false } ], checkedAll: false } }, methods: { checkAll() { for (let i = 0; i < this.cartList.length; i++) { this.cartList[i].checked = this.checkedAll } }, checkOne() { let allChecked = true for (let i = 0; i < this.cartList.length; i++) { if (!this.cartList[i].checked) { allChecked = false break } } this.checkedAll = allChecked } } } </script> ``` 在上面的代码中,`cartList` 是一个包含商品信息的数组,每个商品都有一个 `checked` 属性记录是否被选中。在 `checkAll` 方法中,遍历 `cartList` 将每个商品的 `checked` 属性设置为 `checkedAll`。在 `checkOne` 方法中,检查是否所有的商品都被选中,然后将结果赋给 `checkedAll`。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值