当前位置: 首页 > article >正文

点餐小程序实战教程14点餐功能

目录

  • 1 功能分析
  • 2 初始化菜品的数量
  • 3 加入购物车
  • 4 显示购物车
  • 5 最终的效果
  • 总结

上一篇我们讲解了如果通过扫码实现餐桌信息显示,本篇我们介绍一下点餐的功能。

1 功能分析

点餐的话一般我们是在菜品点击+号或者-号来加入购物车,加入购物车之后还可以修改数量,看到点餐的数量和总价格。

使用微搭实现点餐功能要稍微复杂一点,有几个步骤需要考虑

  • 如何给菜品添加一个默认的数量
  • 如何在菜品显示之后回填用户选择的数量
  • 在点击+号或者-号的时候如何更新购物车的信息

2 初始化菜品的数量

我们在显示菜品的时候,是通过读取数据源的数据进行显示。但是有一个问题是,我们的数据源中并没有数量这个字段,那如何增加这个字段呢?

我们可以考虑在数据列表加载成功时候重新修改一下列表的数据
在这里插入图片描述
在查询成功的时候我们调用一个自定义方法,来重新加载数据。点击代码区点击+号,创建一个javascript方法
在这里插入图片描述
可以修改方法的名称为showList
在这里插入图片描述
在查询成功的时候我们调用这个方法
在这里插入图片描述
在这里插入图片描述
首先我们需要得到列表的数据,可以从事件对象event里获取,我们在自定义方法中添加一个打印方法,打印一下我们的event

console.log(event)

点击实时预览,打开开发者工具,可以看到我们的输出结果
在这里插入图片描述
列表的数据我们可以从event.detail.data里拿到,他的类型是数组,数组的元素是对象,对象里就包含我们在数据源里定义的结构

拿到数据之后就需要增加一个属性,数量。我们先需要添加一个变量,用来标识购物车,变量类型选择数组

在这里插入图片描述
我会去看当前列表里的数据是否在购物车中存在,如果存在我就把购物车中的数量赋值给当前元素,不存在就初始化成0,再增加一个变量,表示构造好的数据,类型选择数组
在这里插入图片描述
在自定义方法中我们初始化一下数据

export default function({event, data}) {
  console.log(event)
  const currentList = event.detail.data
  $w.page.dataset.state.tempList = currentList.map(dish =>{
    const item = $w.page.dataset.state.cart.find(cartItem=>cartItem._id===dish._id)
    dish.count = item?item.count:0
    return dish
  })
  
}

这样执行完毕后,我们的列表数据里就多了一个数量的属性
在这里插入图片描述
数据处理好了之后,我们需要将我们返回的数据绑定到循环展示上
在这里插入图片描述

3 加入购物车

加入购物车的时候,我们先需要搭建一下布局,布局是由两个图标和一个文本组成
在这里插入图片描述
文本组件我们绑定数量属性
在这里插入图片描述
添加一个自定义方法,叫addCart,加入如下代码

export default function ({ event, data }) {
  const dish = data.target
  $w.page.dataset.state.tempList = $w.page.dataset.state.tempList.map(item => {
    if (item._id === dish._id) {
      item.count++
    }
    $w.page.dataset.state.cart
    return item
  })
  const cart = $w.page.dataset.state.cart || [];
  const cartItem = cart.find(item => item._id === dish._id);
  if (cartItem) {
    cartItem.count++;
  } else {
    cart.push({ ...dish, count: 1 });
  }
  $w.page.dataset.state.cart = cart;
}

对应的我们再加一个removeCart的方法,用来从购物车里移除信息

export default function ({ event, data }) {  
  const dishId = data.target._id;  
  const decreaseAmount = 1;  
  let cart = $w.page.dataset.state.cart || [];  
  let tempList = [...$w.page.dataset.state.tempList]; // 使用浅拷贝以避免直接修改原始状态  
  
  const tempListItemIndex = tempList.findIndex(item => item._id === dishId);  
  
  if (tempListItemIndex !== -1) {  
    const tempListItem = tempList[tempListItemIndex];  
  
    if (tempListItem.count >= decreaseAmount) {  
      tempListItem.count -= decreaseAmount;  
  
      // 更新购物车  
      const cartItemIndex = cart.findIndex(item => item._id === dishId);  
      if (cartItemIndex !== -1) {  
        if (tempListItem.count === 0) {  
          // 如果tempList中的数量减至0,则从购物车中删除该项  
          cart.splice(cartItemIndex, 1);  
        } else {  
          // 否则,更新购物车中的数量  
          cart[cartItemIndex].count = tempListItem.count;  
        }  
      }  
  
      // 更新应用状态  
      $w.page.dataset.state.tempList = tempList;  
      $w.page.dataset.state.cart = cart;  
  
      if (tempListItem.count === 0) {  
        // 数量减至0时显示提示,并且此时购物车中的对应项应该已经被删除  
        $w.utils.showToast({  
          title: "已从购物车中移除",  
          icon: "success", // 或者其他适合的图标  
          duration: 2000  
        });  
      }  
    } else {  
      // 数量已经不足以减少,显示提示  
      $w.utils.showToast({  
        title: "数量已经是最小值了",  
        icon: "error",  
        duration: 2000  
      });  
    }  
  } else {  
    // 未找到对应菜品项,显示错误提示  
    $w.utils.showToast({  
      title: "未找到对应的菜品项",  
      icon: "error",  
      duration: 2000  
    });  
  }  
}

在给图片绑定事件的时候,记得要把当前所在行的数据传入自定义方法中
在这里插入图片描述
在这里插入图片描述
点餐的时候,如果没加入购物车,应该只显示+号的图标,我们可以给-号和文本绑定条件展示
在这里插入图片描述

4 显示购物车

当菜品被添加到购物车后,我们需要显示一下购物车的信息。选中页面组件,添加一个普通容器
在这里插入图片描述
里边添加一个普通容器和一个按钮
在这里插入图片描述
修改外层的普通容器的样式,布局设置为横向排列,两端对齐
在这里插入图片描述
在内层的普通容器里继续添加两个普通容器,用来显示购物车的图标和价格
在这里插入图片描述
设置布局为横向排列,左对齐
在这里插入图片描述
第一个普通容器添加一个图片组件和一个文本组件,设置图片的宽和高各为46
在这里插入图片描述
文本内容绑定为购物车的长度
在这里插入图片描述
在添加一个文本用来显示总价,绑定为购物车的总价

"¥ " + $w.page.dataset.state.cart.reduce((accumulator, item) => {  
  return accumulator + (item.jg*item.count || 0); 
}, 0)

在这里插入图片描述

5 最终的效果

初始状态,我们的购物车不显示,只显示一个+号
在这里插入图片描述
点击+号,显示购物车的信息
在这里插入图片描述
继续点+号,总价变化数量不变
在这里插入图片描述

总结

我们本篇介绍了点餐功能,主要涉及到列表数据的搭建,加入购物车,移除购物车的功能。需要掌握数据列表数据加载之后重新构造数据的问题,还有就是购物车和列表的数据的逻辑关系。


http://www.kler.cn/news/326646.html

相关文章:

  • 心理咨询行业为何要有自己的知识付费小程序平台 心理咨询小程序搭建 集师saas知识付费小程序平台搭建
  • 遇到 Docker 镜像拉取失败的问题时该如何解决
  • 六、设计模式-6.3、责任链模式
  • WebAssembly 为什么能提升性能,怎么使用它 ?
  • 晶圆厂如何突破多网隔离实现安全稳定又快速的跨网域文件传输?
  • 执行力怎么培养?
  • 建投数据自主研发相关系统获得欧拉操作系统及华为鲲鹏技术认证书
  • ArduSub程序学习(11)--EKF实现逻辑③
  • 宠物医院微信小程序源码
  • 二叉树深搜专题篇
  • ELement plus 前端表单使用解读
  • 等保测评:如何应对网络攻击
  • leetcode-数组篇7
  • PIKACHU —— 靶场笔记合集
  • 20240930编译orangepi5的Android12使用HDMI0输出
  • 【洛谷】P4819 [中山市选] 杀人游戏 的题解
  • 每天五分钟玩转深度学习框架pytorch:多种定义损失函数的方法
  • UG NX二次开发(C#)-建模-根据拉伸体获取草图对象
  • 【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
  • 【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第四篇-着色器投影-接收阴影部分】
  • 2024/9/30 英语每日一段
  • [卸载] 软件彻底卸载工具的下载及详细安装使用过程(附有下载文件)
  • 代码随想录算法训练营Day11
  • [element-ui]记录对el-table表头样式的一些处理
  • 【机器学习】绘图中使用plt(图像全局)和axes对象(局部子图)的区别
  • 如何使用ssm实现基于在线开放课程的Web前端设计与实现+vue
  • 风险函数梳理工具
  • ros2安装完成后重要的一步
  • 多机部署,负载均衡-LoadBalance
  • 2024年自动化、电气控制系统与设备国际学术会议(AECSE 2024)