点餐小程序实战教程08-购物车功能开发

news2024/11/16 22:29:09

目录

  • 1 创建购物车
  • 2 增加数量
  • 3 减少数量
  • 4 切换分类时回填数据
  • 5 显示购物车信息
  • 总结

我们上一篇搭建了点餐业务的数据初始化加载,本篇实现一下加入购物车的功能。在购物车设计的时候有两种方案,一种是使用数据表的方案,一种是使用变量的方案。

数据表方案的优点是持久化到数据源中,下一次打开小程序的时候还可以继续点餐。变量的方案是比较简单,不用和数据源有太多的交互。

1 创建购物车

打开我们的应用编辑器,在全局变量添加一个变量cartList
在这里插入图片描述

2 增加数量

接着我们实现一下增加数量的事件,在代码区点击+号增加一个自定义方法
在这里插入图片描述
方法的逻辑是将当前数据的count字段加一,并把记录加入到购物车中,如果是首次加入直接在数组中添加元素即可,如果已经存在我们就更新对应的元素,代码如下:

export default function({event, data}) {
   console.log(data.target)
   const record = data.target
   record.count++;
   if($w.app.dataset.state.cartList.length ===0){
      $w.app.dataset.state.cartList.push(record)
   }else{
      let flag = false
      $w.app.dataset.state.cartList.forEach(item=>{
         if(item._id == record._id){
            flag = true
            item.count = record.count
         }
      })
      if(!flag){
         $w.app.dataset.state.cartList.push(record)
      }
   }
}

代码的逻辑是先看购物车是不是空的,如果数组的长度为0表示购物车是空的,那我们直接调用数组的push方法将菜品放入购物车

如果购物车不为空,那么就去循环一下购物车,看当前选的商品放入购物车里没,条件是购物车的商品的标识等于我们选购商品的标识,加入了我们就更新购物车商品的数量,如果没加入我们就直接放入

在调用自定义方法时,需要传入参数,参数是我们当前这条记录
在这里插入图片描述

3 减少数量

增加的做好之后,我们要开发一下减少的功能。同样的在代码区增加一个自定义方法,命名为minus
在这里插入图片描述
减少的逻辑需要先判断一下当前的数量够不够减,不能出现负数,代码如下

export default function ({ event, data }) {
   const record = data.target
   if (record.count > 0) {
      record.count--;
   }

   if ($w.app.dataset.state.cartList.length === 0) {
      $w.app.dataset.state.cartList.push(record)
   } else {
      let flag = false
      $w.app.dataset.state.cartList.forEach(item => {
         if (item._id == record._id) {
            flag = true
            item.count = record.count
         }
      })
      if (!flag) {
         $w.app.dataset.state.cartList.push(record)
      }
   }
}

调用的时候也需要传入所在行的数据
在这里插入图片描述
还有一个逻辑是当数量减为0的时候我们要隐藏减号和文本组件,可以设置条件展示,加一个判断条件
在这里插入图片描述

4 切换分类时回填数据

目前代码存在的问题是如果我们选购了商品,如果切换分类的时候我们已经选择的信息就消失了,为了记住信息,我们在加载数据的时候要把购物车的信息再回填一下,修改我们的initMenuCount方法,添加如下代码

export default function({event, data}) {
   const list = event.detail.data
   console.log(list)
   $w.app.dataset.state.showlist_temp = list.map(item=>{
      const product = $w.app.dataset.state.cartList.find(v=>v._id==item._id)
      item.count = product?product.count:0
      return item
   })
}

这里event.detail.data可以获取原表格的数据,这个是从数据源查出来的,然后我们先是循环了原表格,调用了数组的map方法。在具体的每一条记录我们需要看一下购物车里的数据是否和当前表格一样,一样我们就把数量修改为购物车的数量。

最后处理好的数据我们在赋值回去,这样就起到了一个数据更新的作用。

5 显示购物车信息

我们还需要一个购物车显示的功能,显示总价,已经购买商品的数量。选中页面组件,添加一个普通容器,里边放入网格布局
在这里插入图片描述
修改一下网格布局的列,我们只需要两列
在这里插入图片描述
第一列添加一个图标和两个文本组件
在这里插入图片描述
切换到样式,设置布局模式为横向排列、垂直居中
在这里插入图片描述
第二列添加一个按钮
在这里插入图片描述
我们第一个文本要显示总价,总价的话从购物车求和就可以,绑定如下表达式

`${$w.app.dataset.state.cartList.reduce((total,current)=>{
    return total+(current.cpjg*current.count)
},0).toFixed(2)}`

这里用到了数组的求和方法,reduce需要两个参数,第一个是求和的方法,我们这里使用的是单价*数量进行累加,第二个参数是我们初始时的初值,我们设置为0

第二个文本要显示购买的数量,直接获取数组的长度即可,绑定如下表达式

`${$w.app.dataset.state.cartList.length}`

然后设置一下普通容器的定位设置成固定定位
在这里插入图片描述

总结

本篇我们实现了一下购物车的功能,涉及到添加到购物车,显示总价、购买的件数等逻辑。涉及到具体逻辑就需要对javascript有比较深入的掌握,否则很难实现功能,编程的基本功还是要扎实掌握的。

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

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

相关文章

手机拍摄的视频噪点很多怎么办,视频怎么做降噪处理?

现如今,智能手机已经成为了我们生活中必不可少的存在。而随着智能手机越来越强大,很多人已经开始使用手机来拍摄各种类型的视频。但是由于手机的限制,很多人会发现自己拍摄的视频存在着很多的噪点。那么,我们该怎样来解决拍摄视频…

深入理解强化学习——强化学习和有监督学习

分类目录:《深入理解强化学习》总目录 通过前文的介绍,我们现在应该已经对强化学习的基本数学概念有了一定的了解。这里我们回过头来再看看一般的有监督学习和强化学习的区别。以图片分类为例,有监督学习(Supervised Learning&…

idea软件_启动出错永久办法leetcode关联

目录 idea启动出错启动出错原因1 永久关联leetcode idea启动出错 idea启动没反应的话,在idea的安装目录bin目录下有idea.bat,加入pause,双击启动,如果有问题,idea不会启动,控制台会输出相应错误信息,如果没…

互联网Java工程师面试题·Java 并发编程篇·第二弹

目录 14、什么是 Callable 和 Future? 15、什么是 FutureTask?使用 ExecutorService 启动任务。 16、什么是并发容器的实现? 17、多线程同步和互斥有几种实现方法,都是什么? 18、什么是竞争条件?你怎样发现和解决竞争&…

Jetson Orin NX 开发指南(1): 系统烧录

一、SDK Manager SDK Manager 工具是 NVIDIA 官方推荐的烧写和管理 Jetpack 系统组件的一个图形化烧写工具,使用起来非常的简单方便,但是该软件需要在 x86 的 Ubuntu 18.04 或 Ubuntu 20.04 的系统上运行,因此我们需要准备一台安装了 Ubuntu…

照片怎么压缩变小?

照片怎么压缩变小?在使用聊天工具时,出现无法传输照片的情况很常见,这通常是因为电脑或手机中照片的文件体积太大了。此外,如果照片过大,也会占用设备的内存,导致设备性能下降。因此,我们需要将…

广告牌安全监测,保障户外广告牌的安全与稳定

随着城市的发展和现代化,广告牌已经成为城市风景的一部分。然而,随之而来的是广告牌安全问题,因为它们暴露在各种天气和环境条件下,一旦掉落,可能对人们的生命和财产造成威胁。广告牌安全监测有效的解决了这一问题&…

腾讯云2核4G轻量服务器5M带宽支持多少人同时在线?

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问?5M带宽下载速度峰值可达640KB/秒,阿腾云以搭建网站为例,假设优化后平均大小为60KB,则5M带宽可支撑10个用户同时在1秒内打开网站,从CPU内存的角度,网站程序效…

Python中协程异步IO(asyncio)理解与入门

1、asyncio import asyncio# coroutine function: async开头的函数 async def main():print(hello)await asyncio.sleep(1)print(world)coro main() # coroutine object:协程对象# 当生成协程对象的时候,并不运行函数里面的程序。 # 运行时需要两步走…

10.10 作业

全局函数实现运算符重载 #include "05_fun.h"// 全局函数实现运算符重载// 算数运算符重载 - * / % const Per operator(const Per &L, const Per &R) {Per temp;temp.a L.a R.a;temp.b L.b R.b;return temp; } const Per operator-(const Per &L…

【python海洋专题十六】对大陆周边的数据进行临近插值

前几期内容 画温度、盐度的年平均和季节平均的平面分布图, 对于IAP粗分辨率数据进行处理得到的图像,大陆周围都没有数值。 没能呈现较为漂亮的图像。 甚至是老师或者编辑要求大陆周围不能有空白, 又不想对数据进行全部的分辨率更细的插值。 此时,使用周围临近的数据点代…

GitHub【入门】从入门到会用(千字总结●超详细)

我的个人主页:☆光之梦☆_C语言基础语法(超详细),【java入门】语法总结-CSDN博客 创作不易,如果能帮到你就好 特别标注:我的C语言专栏写的超详细,强烈推荐你去看看哦 注:你的 👍点赞…

epoll 定时器

参考&#xff1a; Linux下使用epoll监听定时器-CSDN博客 但是这个用的是gettimeofday。 本人使用的是 #include <stdlib.h> #include<stdio.h> #include <sys/timerfd.h> #include <sys/epoll.h> #include <unistd.h> #include <sys/time.…

实施运维02

一.网线制作 1.所需材料 网线&#xff0c;水晶头&#xff0c;网线钳&#xff0c;水晶头, 路由器或者网络测速仪 网线钳 网线制作标准 T568A标准&#xff08;交叉线&#xff09;&#xff1a;适用链接场合&#xff1a;电脑-电脑、交换机-交换机、集线器-集线器 接线顺序&…

ESXI使用esxtop命令监控存储的性能

1、监控每个hba卡的io性能 a. ssh登录esxi后台&#xff0c;执行esxtop&#xff0c;再按d切换到磁盘视图&#xff08;hba模式&#xff09; b. 要显示完整的设备名称&#xff1a;SHIFTL&#xff0c;输入36 c. 显示其他的性能指标字段&#xff1a;按f&#xff0c;按a-j选择需要的字…

黑马点评-05缓存穿透问题及其解决方案,缓存空字符串或使用布隆过滤器

缓存穿透问题(缓存空) 缓存穿透的解决方案 缓存穿透(数据穿透缓存直击数据库): 缓存穿透是指客户端请求访问缓存中和数据库中都不存在的数据,此时缓存永远不会生效并且用户的请求都会打到数据库 数据库能够承载的并发不如Redis这么高&#xff0c;如果大量的请求同时访问这种…

准备熬夜加班?curllibcurl 高危漏洞明日公布

近日&#xff0c;curl项目的作者bagder(Daniel Stenberg)在GitHub中发布消息称&#xff0c;将在2023年10月11日发布curl的8.4.0版本。同时&#xff0c;他们还将公开两个漏洞&#xff1a;CVE-2023-38545和CVE-2023-38546。如下图所示&#xff1a; 图片来源于互联网 其中CVE-202…

【算法|双指针系列No.4】leetcode11. 盛最多水的容器

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

十大排序算法Java实现及时间复杂度

文章目录 十大排序算法选择排序冒泡排序插入排序希尔排序快速排序归并排序堆排序计数排序基数排序桶排序时间复杂度 参考资料 十大排序算法 选择排序 原理 从待排序的数据元素中找出最小或最大的一个元素&#xff0c;存放在序列的起始位置&#xff0c; 然后再从剩余的未排序元…

C# Windows 窗体控件中的边距和填充

可以将 Margin 属性、Left、Top、Right、Bottom 的每个方面设置为不同的值&#xff0c;也可以使用 All 属性将它们全部设置为相同的值。 在代码中设置Margin&#xff0c;元素的左边设置为5个单位、上边设置为10个单位、右边设置为15个单位和下边设置为20个单位。 TextBox myT…