uni-app购物车-全选、反选、逐个选中

这里要实现的需求是:
1,点击全选,则全选,再次点击,则取反
2,全选状态下,取消某一个商品,则全选状态消失
3,有些选中,有些没选的状态下,勾选上所有商品,则全选状态选中
3,商品无货状态下不允许选择,并且不影响全选反选

先看效果:

在这里插入图片描述

首先,用到了checkbox-group这个组件,看看官网API就好了,里面添加的内容是我自己的需求,自己随需求:

<!-- 购物列表 html -->
<view class="listCount">
    <checkbox-group @change="checkboxChange">
        <label class="listItem" v-for="item in carArr" :key="item.value">
            <view class="checkBox">
                <checkbox style="transform:scale(0.9)" :value="item.value" :checked="item.checked"  v-show="item.whether"/>
                <view class="notGoods" v-show="!item.whether">
                    无货
                </view>
            </view>
            <view class="itemShow">
                <view class="listImg">
                    <image :src="item.src" mode="aspectFill" style="width: 100%; height: 100%;"></image>
                </view>
                <view class="itemCont">
                    <view class="itemName">
                        {{item.name}}
                    </view>
                    <view class="itemGrade">
                        品相优良
                        <text class="aliIcon">&#xe658;</text>
                    </view>
                    <view class="itemPriceTool">
                        <view class="price">
                            ¥{{item.price}}
                        </view>
                        <view class="itemTool">
                            <text class="toolTwo" v-show="!item.whether">
                                到货提醒
                            </text>
                            <text class="toolOne" v-show="!item.whether">
                                预定
                            </text>
                            <text class="toolOne" v-show="item.whether"  @click="showBottomVisible = true">
                                锁定
                            </text>
                        </view>
                    </view>
                    <view class="aliIcon">
                        &#xe6a7;
                    </view>
                </view>
            </view>
        </label>
    </checkbox-group>
</view>
<!-- 全选按钮 -->
<checkbox-group @change="changeBook">
    <label>
        <checkbox style="transform:scale(0.9)" :checked="allFlag.checked" :value="allFlag.cb"/> 全选
    </label>
</checkbox-group>






<!-- data 数据-->
allFlag: {
    value: 'cb',
    checked: false
},
carArr: [
    {
        value: 'USA',
        name: '摩根财团',
        price: '25.22',
        whether: true,
        src: 'http://img3m6.ddimg.cn/56/6/28519976-1_l_3.jpg'
    },
    {
        value: 'CHN',
        name: '中国高校之殇',
        price: '5.00',
        whether: true,
        src: 'http://img3m1.ddimg.cn/26/6/28510541-1_l_3.jpg'
    },
    {
        value: 'BRA',
        name: '华夏万军',
        price: '63.09',
        whether: true,
        src: 'http://img3m9.ddimg.cn/22/13/28495489-1_l_9.jpg'
    },
    {
        value: 'JPN',
        name: '音乐迷醉指南',
        price: '13.21',
        whether: true,
        src: 'http://img3m8.ddimg.cn/70/21/28509298-1_l_3.jpg'
    },
    {
        value: 'ENG',
        name: '纸上美术馆',
        price: '36.35',
        whether: true,
        src: 'http://img3m8.ddimg.cn/4/25/28500718-1_l_2.jpg'
    },
    {
        value: 'FRA',
        name: '艺术哲学',
        price: '14.36',
        whether: false,
        src: 'http://img3m8.ddimg.cn/40/9/23525608-1_l_4.jpg'
    },
    {
        value: 'BRAs',
        name: '华夏万军',
        price: '63.09',
        whether: false,
        src: 'http://img3m9.ddimg.cn/22/13/28495489-1_l_9.jpg'
    },
]






<!-- js -->
// 全选或者反选 checkbox
changeBook (e) {
    if (e.detail.value.length == 0) {
        this.carArr.map(item => this.$set(item, 'checked', false))
        this.$set(this.allFlag, 'checked', false)
    } else {
        this.carArr.map(item => this.$set(item, 'checked', true))
        this.$set(this.allFlag, 'checked', true)
    }
},
// list checkbox
checkboxChange (e) {
	var items = this.carArr,
		values = e.detail.value;
	for (var i = 0, lenI = items.length; i < lenI; ++i) {
		const item = items[i]
		if(values.includes(item.value)){
			this.$set(item,'checked',true)
		}else{
			this.$set(item,'checked',false)
		}
	}
	//  商品是否全部勾选,判断全选与否状态
	var offCarArr = []
	this.carArr.forEach(item => item.whether == true? offCarArr.push(item): '')
	let allChecks = offCarArr.every(item => item.checked == true)     
	allChecks ? this.$set(this.allFlag, 'checked', true) :this.$set(this.allFlag, 'checked', false)
},

就是这么多啦,欢迎提问,有帮助请点赞加关注,der~~

  • 10
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值