微信小程序购物车页面实现

目录

32.商品加入购物车逻辑实现(前端)

33.购物车页面收货地址实现

34.购物车商品列表显示实现

37.购物车商品复选框选中业务处理

38.购物车全选复选框选中业务处理

39.购物车商品数量编辑实现

40.购物车商品数量为0判定是否删除

42.商品详情立即购买逻辑实现




32.商品加入购物车逻辑实现(前端)

1.先在product_detail下的index.wxml的view标签下添加bindtap

<view class="tool_item btn_cart" bindtap="handleCartAdd"><view>加入购物车</view>
</view>

2.对应在js文件夹下写点击事件handleCartAdd:商品加入购物车

3.需要判断商品加入购物车的逻辑:一种是已经存在购物车中,如果再加,数量加一即可;还有是不存在购物车中的。

```Java// 点击事件 商品加入购物车handleCartAdd(){let cart=wx.getStorageSync('cart')||[];console.log("cart="+cart);let index=cart.findIndex(v=>v.id===this.productInfo.id);if(index===-1){ // 购物车里面不存在当前商品 this.productInfo.num=1;cart.push(this.productInfo);}else{ // 已经存在cart[index].num++;//数量加一}wx.setStorageSync('cart', cart); // 把购物车添加到缓存中//设置提示,加入成功wx.showToast({title: '加入成功',icon:'success',mask:true})},
```

4.上面代码优化:可以将上面代码封装为setCartadd

// 点击事件 商品加入购物车handleCartAdd(){this.setCartadd();wx.showToast({title: '加入成功',icon:'success',mask:true})},// 加入购物车setCartadd(){let cart=wx.getStorageSync('cart')||[];console.log("cart="+cart);let index=cart.findIndex(v=>v.id===this.productInfo.id);if(index===-1){ // 购物车里面不存在当前商品 this.productInfo.num=1;cart.push(this.productInfo);}else{ // 已经存在cart[index].num++;}wx.setStorageSync('cart', cart); // 把购物车添加到缓存中},

33.购物车页面收货地址实现

1.先在第三个标签“购物车”cart下的index.json添加顶部标题

{"usingComponents": {},"navigationBarTitleText": "购物车"
}

2.开始在cart下的index.wxml写“获取收货地址”标签bindtap="handleChooseAddress" 作为点击事件,并在index.less设置样式。index.js写具体的handleChooseAddress方法

1)index.wxml

```Java
<!-- 收货地址 开始 -->
<view class="recevie_address_row"><view class="address_btn" wx:if="{{!address}}"><button type="warn" plain bindtap="handleChooseAddress" >获取收货地址</button></view><view wx:else class="user_info_row"><view class="user_info"><view>收货人:{{address.userName}},{{address.telNumber}}</view><view>{{address.provinceName+address.cityName+address.countyName+address.detailInfo}}</view></view><view class="change_address_btn"><button size="mini" plain>更换地址</button></view></view>
</view>
<!-- 收货地址 结束 -->
```

2)index.less:设置样式包括:获取收货地址按钮,更换地址按钮。左右分采用伸缩盒子flex

.recevie_address_row{.address_btn{padding: 20rpx;button{width: 60%;}}.user_info_row{display: flex;padding: 20rpx;.user_info{flex:5;}.change_address_btn{flex:3;text-align: right;button{border: 1px solid gray;font-weight: normal;}}}
}

3)index.js

写具体的handleChooseAddress方法:先在data里定义,再具体写。由于获取收货地址基本不变。可存入缓存中:  wx.setStorageSync('address', result)

 data: {address:{}},handleChooseAddress(){wx.chooseAddress({success: (result) => {console.log(result)wx.setStorageSync('address', result)},})},

然后onShow中监听页面显示,从缓存中获取地址

/*** 生命周期函数--监听页面显示*/onShow: function () {console.log("show")const address=wx.getStorageSync('address');this.setData({address})},

3.然后在页面显示,在index.wxml中写,引入wx:if="{{!address}}"判断没有值的话显示“获取收货地址”,有值的话显示的是wx:else class="user_info_row"

<!-- 收货地址 开始 -->
<view class="recevie_address_row"><view class="address_btn" wx:if="{{!address}}"><button type="warn" plain bindtap="handleChooseAddress" >获取收货地址</button></view><view wx:else class="user_info_row"><view class="user_info"><view>收货人:{{address.userName}},{{address.telNumber}}</view><view>{{address.provinceName+address.cityName+address.countyName+address.detailInfo}}</view></view><view class="change_address_btn"><button size="mini" plain>更换地址</button></view></view>
</view>
<!-- 收货地址 结束 -->

效果如下图:

34.购物车商品列表显示实现

1.首先数据要显示在页面上,先在index.js的data里定义数据cart:[]。然后可以在onShow里获取,如果购物车是空的,可以||一个空数组。编译后可以在AppData中查看是否存入数据:
 

onShow: function () {console.log("show")const address=wx.getStorageSync('address');const cart=wx.getStorageSync('cart')||[];this.setData({address,cart})},

2.在cart包index.wxml下写view标签,购物车列表包括的要素有:复选框,商品图片,商品信息。同时点击商品图片,点击商品名可以跳转,做法是navigator标签里写url:"/pages/product_detail/index?id={{item.id}}"。大致思路仍然先写标签,再设样式

index.wxml:

<!-- 购物车清单 开始 -->
<view class="cart_content"><view class="cart_main"><view class="cart_item"wx:for="{{cart}}"wx:key="id"><!-- 复选框 开始 --><view class="cart_chk_wrap"><checkbox-group><checkbox></checkbox></checkbox-group></view><!-- 复选框 结束 --><!-- 商品图片 开始 --><navigator class="cart_img_wrap" url="/pages/product_detail/index?id={{item.id}}"><image mode="widthFix" src="{{baseUrl+'/image/product/'+item.proPic}}"></image></navigator><!-- 商品图片 结束 --><!-- 商品信息 开始 --><view class="cart_info_wrap"><navigator url="/pages/product_detail/index?id={{item.id}}"><view class="goods_name">{{item.name}}</view></navigator><view class="goods_price_wrap"><view class="goods_price">¥{{item.price}}</view><view class="cart_num_tool"><view class="num_edit">-</view><view class="goods_num">{{item.num}}</view><view class="num_edit">+</view></view></view></view><!-- 商品信息 结束 --></view></view>
</view>
<!-- 购物车清单 结束 -->

设置样式,在index.less中

.cart_content{background-color: #F5F5F5;.cart_main{padding: 2rpx 10rpx 10rpx 10rpx;.cart_item{display: flex;background-color: white;border-radius: 10px;margin: 20rpx;padding-right: 20rpx;.cart_chk_wrap{flex:1;display: flex;justify-content: center;align-items: center;margin: 20rpx;}.cart_img_wrap{flex:2;display: flex;justify-content: center;align-items: center;background-color: #F5F5F5;margin: 20rpx;border-radius: 10px;image{width: 80%;}}.cart_info_wrap{flex:4;display: flex;flex-direction: column;justify-content: space-around;.goods_name{font-weight: bolder;display: -webkit-box;overflow: hidden;-webkit-box-orient: vertical;-webkit-line-clamp: 2;}.goods_price_wrap{display: flex;justify-content: space-between;.goods_price{color: var(--themeColor);font-size: 34rpx;}.cart_num_tool{display: flex;.num_edit{display: flex;justify-content: center;align-items: center;width: 55rpx;height: 55rpx;}.goods_num{display: flex;justify-content: center;align-items: center;width: 85rpx;height: 55rpx;background-color: #F5F5F5;}}}}}}
}

37.购物车商品复选框选中业务处理

复选框中,并设定点击事件bindchange命名为:handleItemChange,在index.js下写具体的商品选中事件处理方法:e作为事件源。e.currentTarget.dataset表示事件发生的当前元素的数据集合,包含了该元素的属性值。通过获取该数据集合中的id属性值,可以确定当前用户操作的是购物车中哪一项商品。

 // 商品选中事件处理handleItemChange(e){const {id}=e.currentTarget.dataset;let {cart}=this.data;let index=cart.findIndex(v=>v.id===id);console.log(index)cart[index].checked=!cart[index].checked;this.setCart(cart);},

设置缓存方便下次打开时存在缓存

  // 设置购物车状态 重新计算 底部工具栏 全选 总价 总数量 重新设置缓存setCart(cart){let allChecked=true;let totalPrice=0;let totalNum=0;cart.forEach(v=>{if(v.checked){totalPrice+=v.price*v.num;totalNum+=v.num;}else{allChecked=false;}})allChecked=cart.length!=0?allChecked:false;this.setData({cart,allChecked,totalNum,totalPrice})// cart设置到缓存中wx.setStorageSync('cart', cart);}

38.购物车全选复选框选中业务处理

在cart包下的,index.js写具体的商品全选事件handleItemAllCheck,点了之后是false状态,需要取反,取反后每个新的属性值allcheck设置到每个cart商品的属性(foreach遍历设置)

handleItemAllCheck(){let {cart,allChecked}=this.data;console.log(cart,allchecked)allChecked=!allChecked;cart.foreach(v=>v.checked=allChecked);this.setCart(cart);
}

39.购物车商品数量编辑实现

购物车里的商品数量的加和减需要绑定tab事件,加1还是减1要带operation参数,绑定参数

40.购物车商品数量为0判定是否删除

当把商品数量减为0时,出现弹窗提示:您是否要删除。设定弹窗出现条件:数量为1且操作为减一:cart[index].num===1 && operation === -1。删除完之后重新this.setCart(cart)显示页面

// 商品数量的编辑功能handleItemNumEdit(e){const {id,operation}=e.currentTarget.dataset;console.log(id,operation)let {cart}=this.data;let index=cart.findIndex(v=>v.id===id);if(cart[index].num===1 && operation === -1){wx.showModal({title:'系统提示',content:'您是否要删除?',// 点击取消cancelColor: 'cancelColor',// 点击确定success:(res)=>{if(res.confirm){// 调用方法,指定索引删除cart.splice(index,1);this.setCart(cart);}}})}else{cart[index].num+=operation;this.setCart(cart);}},

42.商品详情立即购买逻辑实现

在product_detail包下

点击商品下的立即购买,会实现跳转到购物车页面。

首先在html的“立即购买”的view标签里添加bindtap="bandleBuy"事件

  <view class="tool_item btn_buy" bindtap="handleBuy"><view>立即购买</view></view>

然后在index.js里写具体的handleBuy方法

// 点击 立即购买handleBuy(){this.setCartadd();wx.switchTab({url: '/pages/cart/index',})},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/238970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

控制中存在的一些问题(注意事项)

控制器要阶次要降阶&#xff0c;阶数过高不行 机械臂上层控制器降阶的目的是简化控制算法&#xff0c;提高实时性能&#xff0c;并减少计算资源的消耗。当控制器的阶数过高时&#xff0c;可能会导致以下问题&#xff1a; 计算复杂性增加&#xff1a;高阶控制器需要更多的计算…

只更新软件,座椅为何能获得加热功能?——一文读懂OTA

2020年&#xff0c;特斯拉发布过一次OTA更新&#xff0c;车主可以通过这次系统更新获得座椅加热功能。当时&#xff0c;这则新闻震惊了车圈和所有车主&#xff0c;彼时的大家还没有把汽车当作可以“升级”的智能设备。 如今3年过去了&#xff0c;车主对各家车企的OTA升级早已见…

FCIS 2023网络安全创新大会-核心PPT资料下载

一、峰会简介 本次会议的主题是“AI大模型、人工智能与智能制造安全、攻击面管理与供应链安全”。 1、AI大模型 会议首先探讨了AI大模型在网络安全领域的应用。AI大模型是一种基于深度学习的模型&#xff0c;具有强大的特征提取和分类能力&#xff0c;可以用于检测和防御各种…

Unity3D移动端实现摇一摇功能

手机摇一摇功能在平时项目开发中是很常见的需求&#xff0c;利用Unity的重力感应可以很方便的实现该功能。 Unity简化了重力感应的开发&#xff0c; 通过访问Input.acceleration属性&#xff0c;取回加速度传感器的值。首先我们看一下重力传感器的方向问题。Unity3D中重量的取…

四、Spring IoC实践和应用(基于注解方式管理 Bean)

本章概要 基于注解方式管理 Bean 实验一&#xff1a; Bean注解标记和扫描 (IoC)实验二&#xff1a; 组件&#xff08;Bean&#xff09;作用域和周期方法注解实验三&#xff1a; Bean属性赋值&#xff1a;引用类型自动装配 (DI)实验四&#xff1a; Bean属性赋值&#xff1a;基本…

在MacOS上Qt配置OpenCV并进行测试

一.Qt环境准备 上一篇博客我讲了如何下载配置OpenCV库&#xff0c;但是在Qt5.15.2使用OpenCV库时&#xff0c;出现了一个问题就是我下载的Qt5.15.2是x86架构的&#xff0c;不能对OpenCV库进行链接&#xff0c;而OpenCV库是arm架构的 直接使用Qt5.15.2编译链接OpenCV库链接头文件…

二的幂数组中查询范围内的乘积

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 给你一个正整数 n &#xff0c;你需要找到一个下标从 0 开始的数组 powers &#xff0c;它包…

千帆 AppBuilder 初体验,不仅解决解决了我筛选简历的痛苦,更是让提效10倍!

文章目录 &#x1f31f; 前言&#x1f31f; 什么是百度智能云千帆 AppBuilder&#x1f31f; 百度智能云千帆 AppBuilder 初体验&#x1f31f; 利用千帆AppBuilder搭建简历小助手&#x1f31f; 让人眼前一亮的神兵利器 - 超级助理 &#x1f31f; 前言 前两天朋友 三掌柜 去北京…

PostGIS学习教程十四:更多的空间连接

PostGIS学习教程十四&#xff1a;更多的空间连接 在上一节中&#xff0c;我们看到了ST_Centroid(geometry)和ST_Union([geometry])函数&#xff0c;以及一些简单的示例。在本节中&#xff0c;我们将用它们做一些更详细的事情。 提示&#xff1a;写完文章后&#xff0c;目录可以…

[RK-Linux] 解决RK3399 M.2 NVMe SSD根文件系统分区容量无法扩展到最大问题

延续《[RK-Linux] RK3399支持M.2 NVMe SSD启动》 在检查分区与挂载情况的时候,根文件系统分区容量是有问题的: root@buildroot:/# df -h Filesystem Size Used Avail Use% Mounted on /dev/root 692M 430M 209M 68% / devtmpfs 1.9G 8.0K 1.9G 1%…

Jmeter 性能 —— 监控服务器!

Jmeter监控Linux需要三个文件 JMeterPlugins-Extras.jar (包&#xff1a;JMeterPlugins-Extras-1.4.0.zip)JMeterPlugins-Standard.jar (包&#xff1a;JMeterPlugins-Standard-1.4.0.zip)ServerAgent-2.2.3.zip 1、Jemter 安装插件 在插件管理中心的搜索Servers Performan…

MySQL运维实战(1.2)安装部署:使用二进制安装部署

作者&#xff1a;俊达 引言 上一篇我们使用了RPM进行安装部署&#xff0c;这是一种安装快速、简化部署和管理过程、与操作系统提供的包管理工具紧密集成的部署方法。此外&#xff0c;当你需要更高的灵活性和自定义性&#xff0c;并且愿意承担一些额外的手动配置和管理工作&am…

一套rk3588 rtsp服务器推流的 github 方案及记录 -02

整体方案参考上一篇博文 https://blog.csdn.net/qq_31764341/article/details/134810566 本篇博文主要介绍基于RK3588进行硬解码 还是之前的套路&#xff0c;我不生产代码&#xff0c;我只是代码的搬运工&#xff0c;今天我们搬运瑞芯微的官方代码&#xff0c;并记录下来整个调…

HBuilderX项目配置使用uview

配置uview&#xff0c;先安装再配置 如果没有package.json文件&#xff0c;先打开终端&#xff0c;执行命令 npm init -y 然后就会生成 package.json 安装 使用npm安装uview npm install uview-ui2.0.36 安装好之后&#xff0c;可以看到package.json里面已经显示版本了 查…

android studio位置相关

android studio自带一个版本的jdk&#xff0c;所以可以不用下载&#xff0c;配置jdk。 也可以自己再下载配置不同版本的jdk. SDK最好不要放在C盘&#xff0c;太占内存了。 .gradle,.android,.android Studio都最好移动到其他盘&#xff0c;占内存。 https://blog.csdn.net/Li…

Unity中Shader旋转矩阵(四维旋转矩阵)

文章目录 前言一、围绕X轴旋转1、可以使用上篇文章中&#xff0c;同样的方法推导得出围绕X轴旋转的点阵。2、求M~rotate~ 二、围绕Y轴旋转1、可以使用上篇文章中&#xff0c;同样的方法推导得出围绕Y轴旋转的点阵。2、求M~rotate~ 三、围绕Z轴旋转1、可以使用上篇文章中&#x…

2000+线下门店数字化转型,盘活近500+门店账号!

伴随着社交媒体的快速发展&#xff0c;消费者的注意力开始往线上转移。社交媒体在消费者购买决策过程中发挥着越来越重要的作用&#xff0c;逐渐成为大家获取信息、产品种草并购买下单的平台。 今年双十一期间&#xff0c;抖音商城多数品类销售额均呈现大幅增长趋势&#xff0c…

MPI安装与程序设计

MPI MPI&#xff08;Message Passing Interface&#xff09;是一种用于编写并行程序的标准和库&#xff0c;用于在分布式内存系统中进行消息传递和并行计算。MPI提供了一组函数和语义&#xff0c;用于在多个进程之间进行通信和同步&#xff0c;以实现并行计算和并行任务的协调…

ASP.Net实现姓名添加查询(三层架构)

目录 演示功能&#xff1a; 点击启动生成页面 点击搜索模糊查询 点击添加跳转新界面 点击Button添加姓名 步骤&#xff1a; 1、建文件 2、添加引用关系 3、根据数据库中的列写Models下的XueshengModels类 4、DAL下的DBHelper&#xff08;对数据库进行操作&#xff09;…

深入理解 Union 和 Union All 的区别及优化技巧

嗨&#xff0c;大家好&#xff0c;欢迎来到程序猿漠然公众号&#xff0c;我是漠然。 今天&#xff0c;我将和大家一起深入探讨数据库查询中的两个常用操作&#xff1a;Union 和 Union All。这两个操作虽然看起来相似&#xff0c;但在使用时却有一些需要注意的地方。希望通过我…