目录

1、代码分析

1.1  dom结构分析

1.2  全选控制反选

1.3  反选控制全选

1.4、计算总价

1.4 加、减

2、效果、代码演示

1、代码分析

1.1  dom结构分析

购物车的组件结构主要由两部分组成:多选框部分( checkbox-group ) + 全选框部分( view )

1.2  全选控制反选

业务逻辑:

1、全选框(选中)——》 多选框(选中)、全选框(不选中)——》 多选框(不选中)

2、令复选框跟随全选框的状态变化——遍历数据,设置每条数据的 isChecked 状态

注意:因为无法直接操作数据,所以需要先行拷贝数据,再对其进行遍历(在本项目中,所有需要对数据进行遍历、筛选操作的步骤,都需要先拷贝数据)

 allChecked(e){console.log(e);  //触发点击事件,拿到全选框的事件源对象// 全选框: 状态为 true时,令其为 false,当状态为 false时,令其状态变为 trueif(this.data.isAllChecked){// 遍历数据,令复选框的状态跟随全选框变化// 拷贝数据、遍历数据let goodslist=JSON.parse(JSON.stringify(this.data.goods))goodslist.forEach(item=>item.isChecked=false)this.setData({isAllChecked:false,goods:goodslist  //重新渲染})}else{let goodslist=JSON.parse(JSON.stringify(this.data.goods))goodslist.forEach(item=>item.isChecked=true)this.setData({isAllChecked:true,goods:goodslist})}},

1.3  反选控制全选

业务逻辑:

1、多选框(全部选中)——》全选框(选中)

因为复选框有多个,全选框只有一个,所以多选框控制全选框被选中的前提是确定每一个多选框都被选中了  ,打印复选框的事件源对象,发现复选框有一 detail.value 属性,可显示 复选框为 true 的对象 / 数量。所以当 e.detail.value.length===this.data.goods.length 时,表示复选框都被选中了

2、多选框(有一不选中)——》全选框(不选中)

遍历数据( forEach ) 并 检查元素 ( includes ),如果 e.detail.value 中包含 数据id,则令该复选框的 isChecked=true,否则为 false

 // 单选控制全选changeCound(e) {console.log(e);let checkedArr = e.detail.valueif (checkedArr.length == this.data.goods.length) {let goodsList = JSON.parse(JSON.stringify(this.data.goods))goodsList.forEach(item => item.isChecked = true)this.setData({isAllChecked: true,goods: goodsList})} else {let goodsList = JSON.parse(JSON.stringify(this.data.goods))goodsList.forEach(item => {if (checkedArr.includes(item.id)) {item.isChecked = true} else {item.isChecked = false}})this.setData({isAllChecked: false,goods: goodsList})}},

1.4、计算总价

通常用 reduce 来计算总价,其中 total 表示旧值,item表示新值,0为初始值

. reduce( ( total , item ) => { } , 0 )

 // 计算总价computedTotalPrice() {let totalPrice = this.data.goods.reduce((total, item) => {if (item.isChecked) {return total + item.num * item.price} else {return total}}, 0)this.setData({totalPrice: totalPrice})},

1.4 加、减

 // 加、减、删除handle: function (e) {let id = e.currentTarget.dataset.idconsole.log(id);var index = e.currentTarget.dataset.indexvar val = `goods[${index}].num`  //对数据对象 goods 中的 num 属性进行修改let oldnum = this.data.goods.find(item => item.id == id).num //查找console.log(oldnum);// 减if (e.currentTarget.dataset.name == "mulse") {let newNum = oldnum - 1if (newNum > 0) {this.setData({[val]: newNum})}else if(newNum == 0){let goodsList = JSON.parse(JSON.stringify(this.data.goods))let newGoodList=goodsList.filter(item=>item.id!==id)this.setData({goods:newGoodList})}// 加}else if(e.currentTarget.dataset.name=="add"){let newnum=++oldnumthis.setData({[val]:newnum})}  // 删除else if (e.currentTarget.dataset.name == "del") {let goodslist = JSON.parse(JSON.stringify(this.data.lists))let newLists = goodslist.filter(item => item.id !== id)this.setData({lists: newLists})}this.computedTotalPrice()}
})

2、代码演示

index.wxml:

<checkbox-group bindchange="changeCound" class="top"><view wx:for="{{goods}}" wx:key="id" class="checkbox"><view class="chleft"><checkbox value="{{item.id}}" checked="{{item.isChecked}}" class="cleft"></checkbox><image src="{{item.imgUrl}}" mode="" class="pic" /></view><view class="Box"><view class="box-left"><text class="name">{{item.name}}</text><text class="price">¥{{item.price}}</text></view><view class="box-right"><text bindtap="handle" data-id="{{item.id}}" data-name="mulse" data-index="{{index}}">-</text><text>{{item.num}}</text><text bindtap="handle" data-id="{{item.id}}" data-name="add" data-index="{{index}}">+</text><text bindtap="handle" class="del">x</text></view></view></view>
</checkbox-group>
<view class="bottom"><view class="bottom-box" bindtap="allChecked"><label><checkbox value="" checked="{{isAllChecked}}" /><text>全选</text></label></view><view class="total">{{totalPrice}} 元</view>
</view>

index.scss

.top {height:90vh;overflow: auto;.checkbox {position: relative;width: 100vw;height: 100px;border: 1px solid #eee;display: flex;flex-direction: row;.chleft{display: flex;flex-direction: row;align-content: center;width: 41%;.cleft {margin-left: 10px;margin-right: 10px;line-height: 100px;}.pic {width:80px;height: 80px;margin-top: 10px;object-fit: cover;}}.Box{width: 59%;height: 100%;background-color: #fff;.box-left{position: relative;width: 100%;height: 50%;text{position: relative;width:50px;height: 20px;margin-left: 10px;}.name{position: absolute;top:20rpx;left:5rpx;}.price{position: absolute;top:20rpx;right:5rpx;text-align: left;}}.box-right{position: relative;margin-top: 17px;>text{width: 20px;margin-left: 10px;font-weight: bolder;}.del{position: absolute;top:-2px;right: 10px;margin-left: 100px;}}}}
}
.bottom{position: fixed;bottom: 0;left:0;width: 100%;height: 11vh;box-shadow: 5px 5px 5px 5px rgb(204, 204, 204);line-height: 11vh;display: flex;flex-direction: row;.bottom-box{width: 50%;margin-left: 10px;}.total{width: 50%;text-align: right;padding-right: 15px;}
}

index.js

Page({data: {goods: [{id: '1',name: '黄桃',num: 10,price: 10,isChecked: false,imgUrl: '/images/HT.jpg'},{id: '2',name: '西瓜',num: 20,price: 8,isChecked: true,imgUrl: '/images/XG.jpg'},{id: '3',name: '猕猴桃',num: 6,price: 12,isChecked: false,imgUrl: '/images/MHT.jpg'}],isAllChecked: false,totalPrice: 0},onLoad() {this.computedTotalPrice()},// 单选控制全选changeCound(e) {console.log(e);let checkedArr = e.detail.valueif (checkedArr.length == this.data.goods.length) {let goodsList = JSON.parse(JSON.stringify(this.data.goods))goodsList.forEach(item => item.isChecked = true)this.setData({isAllChecked: true,goods: goodsList})} else {let goodsList = JSON.parse(JSON.stringify(this.data.goods))goodsList.forEach(item => {if (checkedArr.includes(item.id)) {item.isChecked = true} else {item.isChecked = false}})this.setData({isAllChecked: false,goods: goodsList})}this.computedTotalPrice()},// 全选控制单选allChecked(e) {if (this.data.isAllChecked) {let goodsList = JSON.parse(JSON.stringify(this.data.goods))goodsList.forEach(item => item.isChecked = false)  //这里是赋值this.setData({isAllChecked: false,goods: goodsList})} else {let goodsList = JSON.parse(JSON.stringify(this.data.goods))goodsList.forEach(item => item.isChecked = true)  //这里是赋值this.setData({isAllChecked: true,goods: goodsList})}this.computedTotalPrice()},// 计算总价computedTotalPrice() {let totalPrice = this.data.goods.reduce((total, item) => {if (item.isChecked) {return total + item.num * item.price} else {return total}}, 0)this.setData({totalPrice: totalPrice})},// 加、减、删除handle: function (e) {let id = e.currentTarget.dataset.idconsole.log(id);var index = e.currentTarget.dataset.indexvar val = `goods[${index}].num`let oldnum = this.data.goods.find(item => item.id == id).numconsole.log(oldnum);if (e.currentTarget.dataset.name == "mulse") {let newNum = oldnum - 1if (newNum > 0) {this.setData({[val]: newNum})}else if(newNum == 0){let goodsList = JSON.parse(JSON.stringify(this.data.goods))let newGoodList=goodsList.filter(item=>item.id!==id)this.setData({goods:newGoodList})}}else if(e.currentTarget.dataset.name=="add"){let newnum=++oldnumthis.setData({[val]:newnum})}this.computedTotalPrice()}
})

11、微信小程序——购物车相关推荐

  1. 微信小程序购物车 数量加减功能

    微信小程序购物车 数量加减功能 wxml <!-- 主容器 --> <view class="stepper"> <!-- 减号 --> < ...

  2. “完美”解决微信小程序购物车抛物动画,在连续点击时出现计算错误问题,定时器停不下来。

    "完美"解决微信小程序购物车抛物动画,在连续点击时出现计算错误问题,定时器停不下来. 参考文章: (1)"完美"解决微信小程序购物车抛物动画,在连续点击时出现计 ...

  3. 微信小程序全选,微信小程序checkbox,微信小程序购物车

    微信小程序,这里实现微信小程序checkbox,有需要此功能的朋友可以参考下. 摘要: 加减商品数量,汇总价格,全选与全不选 设计思路: 一.从网络上传入以下Json数据格式的数组  1.标题titl ...

  4. 原生微信小程序购物车

    原生微信小程序购物车!! 效果: html: <view style="background-color: #eeeeee;height: 100vh;"><vi ...

  5. 微信小程序购物车弹出层

    https://www.jianshu.com/p/a0c2c8712dab  微信小程序购物车 数量加减功能 wxml: <!--index.wxml--> <button bin ...

  6. 微信小程序购物车功能

    微信小程序购物车效果 购物车是一个比较简单的小功能~ 购物车功能主要运用了微信小程序的缓存机制,在商品页面将需要添加的数据同步传入缓存中,然后在购物页面通过同步方法拿到对应的数据,最后在页面上进行渲染 ...

  7. 微信小程序购物车请求服务器数据,微信小程序购物车案例

    最近呢,我看到有人在问微信小程序的购物车怎么写,我呢就在这里写一写: 购物车主要的就是全选的判断.勾选单个物品判断是否全选.计算总价 效果Gif图: 直接简单粗暴的上代码: wxml代码: 全选 {{ ...

  8. 微信小程序购物车模块(缓存相关知识点)

    微信小程序购物车模块(缓存相关知识点) 1.前言: 本购物车模块不使用数据库来实现,将以小程序内置的本地存储模拟实现 2.wxml: 先在加入购物车模块增加点击事件 <view class=&q ...

  9. 微信小程序购物车组件

    微信小程序购物车组件 微信小程序购物车功能是经常使用的,您可以下载此组件来使用. GitHub:下载地址

  10. 微信小程序 购物车简单实例

    微信小程序,这里实现购物车功能的小demo,有需要此功能的朋友可以参考下. 摘要: 加减商品数量,汇总价格,全选与全不选 设计思路: 一.从网络上传入以下Json数据格式的数组 1.购物车id:cid ...

最新文章

  1. Shell脚本中command not found报错处理
  2. Java 学习网站汇总贴
  3. 【翻译】卡通图解DNS,你的信息怎么被泄露的?
  4. 程序员过关斩将--领导说我的类的职责不单一
  5. MySQL日志:binlog、事务日志(redo、undo)
  6. Windows 系统下通过命令将本地文件上传至远程 Linux 主机的指定目录下
  7. 程序员面试金典 - 面试题 17.06. 2出现的次数(找递推规律)
  8. Lenovo 媽媽咪啊,坑爹麼?(Win 7 整合 USB3 NVME )驅動
  9. html和ascll有什么关联,什么是HTML ASCII(HTML ASCII)?
  10. Python基础2(2017-07-18)
  11. 电子过载继电器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  12. 家庭宽带服务器有什么作用,家用宽带网络与服务器使用的网络有什么不同?
  13. Laravel的env和config傻傻分不清?
  14. TIA博途V17中ProDiag功能的使用方法示例(三)文本列表
  15. pycharm中安装pymysql
  16. 设置mysql时间戳默认值(TIMESTAMP)
  17. 并发用户数,吞吐量计算公式
  18. 在线支付支付宝(一)之开发者账号申请
  19. 百度AI攻略:实现人体姿态判定打分
  20. (七)集成学习中-投票法Voting

热门文章

  1. 【ChatGPT】Spire.Doc 给 Word 文档设置背景颜色和背景图片
  2. codeforces:E2. Array and Segments (Hard version)【线段树 + 区间修改】
  3. 关于淘宝直通车的那些事(二):关键词选词方法
  4. java中循环输入_如何用java循环输入并且当输入0时结束循环?
  5. 个人财务管理系统——Java期末项目开发实例
  6. stm32f030x8.h文件内容
  7. MongoEngine中文文档
  8. 绝版「游戏」保护计划!
  9. SpringSecurity匿名用户访问权限
  10. java大数除法_java大数除法求余数