vue vant checkbox

<template>
    <div class="car">
        <h3 style="text-align: center;">购物车</h3>
       <ul>
          <li v-for="(item,index) in carts" :key="index">
            <div class="carProList">
               <div class="carProSelect carProInfo">
                     <van-checkbox v-model="item.danxuan" @change="danxuanChecked(item.danxuan)"/>
               </div>
               <div class="carProImg carProInfo">
                     <img :src="item.proImg"/>
               </div>
               <div class="cartInformation carProInfo">
                     <div>
                         {{item.proName}}
                     </div>
                     <div>
                         {{item.proPrice}}
                     </div>
                     <div>
                         <van-stepper v-model="item.homeValue" />
                     </div>
               </div>
               <div class="deleteCarPro carProInfo">
                     1
               </div>
            </div>
          </li>
       </ul>
        <van-submit-bar
              :price="sum()"
              button-text="提交订单"
            >
              <van-checkbox @change="toggleCheckedAll" v-model="checkedAll">全选</van-checkbox>
            </van-submit-bar>
    </div>
</template>

<script>
 import { mapState } from 'vuex'
 import { Checkbox, CheckboxGroup } from 'vant';
 import { Card } from 'vant';
 import { Stepper } from 'vant';
 import { SubmitBar } from 'vant';
 export default{
    data(){
     return{
         checkedAll:true,
         partCheck:false
     }
   },
   components:{
     [Checkbox.name]:Checkbox,
     [CheckboxGroup.name]:CheckboxGroup,
     [Card.name]:Card,
     [Stepper.name]:Stepper,
     [SubmitBar.name]:SubmitBar
   },
   computed:{
     ...mapState([
       "carts"
     ])
   },
   methods:{
     toggleCheckedAll(val){
       if(!val){
            this.carts.forEach((item)=>{
              item.danxuan = false  
            })
            this.checkedAll = false
       }else{
            this.carts.forEach((item)=>{
              item.danxuan = true  
            })
            this.checkedAll = true
       }
     },
     danxuanChecked(cart){
       if(!cart){
         this.checkedAll = false
       }
       var isExitCheckedNo = this.carts.every(item=>{
         return item.danxuan === true     
       });
       console.log(isExitCheckedNo);
       
       if(isExitCheckedNo){
         this.checkedAll = true    
       }else{
           this.checkedAll = false
       }
     },
     sum(){
       var totalSum = 0;
       this.carts.forEach((item)=>{
         if(item.danxuan){
           totalSum+=item.proPrice*item.homeValue*100    
         }
       })
       return totalSum
     }
   }
 }
</script>

我是用vue+vantui搭建的一个购物车,我想实现全选和全不选,以及单选的时候判断是否全部选中和部分选中,但是vant它的触发事件是change,也就是我在将列表中的其中一个checkbox设置为false时,我的本意是只让全选变为checked =false,可是这个时候全选按钮change了,变成false了,然后会执行让所有单选变成false(因为我在点击全选按钮时如果选中,所有列表全选中,如果全选按钮不选中,则所有的列表不选中)。 大神帮忙分析下,

阅读 10.7k
6 个回答
新手上路,请多包涵

虽然过去很久了, 那么多人浏览, 我回答下,

@change="toggleCheckedAll"
改为
@click="toggleCheckedAll"

不传参数val, 直接用this.checkedAll 判断,

值得注意的是, click 之后回去到的 this.checkedAll 是改变之前的

我觉得你的全选全不选绑定到一个数据上,判断是否全部选中和部分选中绑定到另外一个数据上,应该更加合适。

你的是否全选状态可以遍历carts里的单选进行判断 不需要变量~

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏