HarmonyOS NEXT星河版之美团外卖点餐功能实战(下)

文章目录

    • 一、购物车逻辑
      • 1.1 购物车及加减菜
      • 1.2 菜品的加减---方案一
      • 1.3 菜品的加减---方案二
      • 1.4 购物车View完善
      • 1.5 清空购物车
      • 1.5 购物车数量和价格
    • 二、小结

一、购物车逻辑

1.1 购物车及加减菜

utils目录下新建CartStore.ets文件,如下:

import { FoodItem } from '../models'// 本地持久化购物车数据
PersistentStorage.persistProp<FoodItem[]>('cartStore', [])export class CartStore {static getCarts() {return AppStorage.get<FoodItem[]>('cartStore') || [] as FoodItem[]}/*** 加菜or减菜* @param foodItem* @param type*/static addOrCutFood(foodItem: FoodItem, type: 'add' | 'cut') {const cartList = CartStore.getCarts()const item = cartList.find((item) => item.id === foodItem.id)// 加菜if (type === 'add') {if (item) {item.count++} else {foodItem.count = 1cartList.unshift(foodItem)}} else { // 减菜if (item && item.count > 0) {item.count--if (item.count === 0) {const index = cartList.findIndex((item) => item.id === foodItem.id)cartList.splice(index, 1)}}}AppStorage.set<FoodItem[]>('cartStore', [...cartList])}
}

1.2 菜品的加减—方案一

实现如下效果,当选择数量大于0时展示-及数量
在这里插入图片描述
改造MTAddCutView,如下:

import { FoodItem } from '../models'
import { CartStore } from '../utils/CartStore'@Preview
@Component
export struct MTAddCutView {// 当前菜品@Require @Prop foodItem: FoodItem = new FoodItem()// 购物车数据@Consume cartList: FoodItem[]// 当前选择数量getCount() {return this.cartList.find(obj => obj.id === this.foodItem.id)?.count || 0}build() {Row({ space: 8 }) {Row() {Image($r('app.media.ic_screenshot_line')).width(10).aspectRatio(1)}.width(16).height(16).justifyContent(FlexAlign.Center).backgroundColor(Color.White).borderRadius(4).border({color: $r('app.color.main_color'),width: 0.5})// 如果为0,则取消展示.visibility(this.getCount() > 0 ? Visibility.Visible : Visibility.Hidden)// 减少菜品.onClick(() => {CartStore.addOrCutFood(this.foodItem, 'cut')})Text(this.getCount().toString()).fontSize(14).visibility(this.getCount() > 0 ? Visibility.Visible : Visibility.Hidden)Row() {Image($r('app.media.ic_public_add_filled')).width(10).aspectRatio(1)}.width(16).height(16).justifyContent(FlexAlign.Center).borderRadius(4).backgroundColor($r('app.color.main_color'))// 添加菜品.onClick(() => {CartStore.addOrCutFood(this.foodItem, 'add')})}}
}

在主页面MeiTuanPage.ets中,通过WatchStorageProp实现数据动态展示:

// 方案一:使用StorageProp和Watch实现
@StorageProp('cartStore') @Watch('onCartChange') cartData: FoodItem[] = []
// 购物车数据变化发生回调
onCartChange() {this.cartList = CartStore.getCarts()
}

1.3 菜品的加减—方案二

使用事件总线实现事件的发布和订阅。
CartStore.ets中增加事件发布:

...AppStorage.set<FoodItem[]>('cartStore', [...cartList])
// 方案二:使用事件总线
getContext().eventHub.emit('changeCart')
...

MeiTuanPage.ets中注册订阅:

aboutToAppear(): void {this.categoryList = mockCategorythis.cartList = CartStore.getCarts()// 方案二:使用事件总线getContext().eventHub.on('changeCart', () => {this.cartList = CartStore.getCarts()})
}

1.4 购物车View完善

购物车展示真实数据及加减菜品:
MTCartView

import { FoodItem } from '../models'
import { MTCartItemView } from './MTCartItemView'@Preview
@Component
export struct MTCartView {@Consume cartList: FoodItem[]build() {Column() {Column() {// 头部Row() {Text('购物车').fontSize(14)Text('清空购物车').fontColor($r('app.color.search_font_color')).fontSize(12)}.width('100%').height(48).justifyContent(FlexAlign.SpaceBetween).padding({ left: 15, right: 15 })// 购物车列表List() {ForEach(this.cartList, (item: FoodItem) => {ListItem() {MTCartItemView({ foodItem: item })}})}.divider({ strokeWidth: 1, color: '#e5e5e5', startMargin: 20, endMargin: 20 })}.backgroundColor(Color.White).padding({bottom: 88}).borderRadius({topLeft: 12,topRight: 12})}.width('100%').height('100%').justifyContent(FlexAlign.End).backgroundColor('rgba(0,0,0,0.5)')}
}

MTCartItemView

import { FoodItem } from '../models'
import { MTAddCutView } from './MTAddCutView'@Preview
@Component
export struct MTCartItemView {foodItem: FoodItem = new FoodItem()build() {Row({ space: 6 }) {Image('https://bkimg.cdn.bcebos.com/pic/4d086e061d950a7bc94a331704d162d9f3d3c9e2').width(42).aspectRatio(1).borderRadius(5)Column({ space: 3 }) {Text(this.foodItem.name)Row() {Text() {Span('¥').fontSize(10)Span(this.foodItem.price.toString()).fontColor($r('app.color.main_color')).fontSize(14).fontWeight(600)}MTAddCutView({ foodItem: this.foodItem })}.width('100%').justifyContent(FlexAlign.SpaceBetween)}.layoutWeight(1).alignItems(HorizontalAlign.Start)}.height(60).alignItems(VerticalAlign.Top).width('100%').padding({ top: 12, left: 15, right: 15, bottom: 12 })}
}

1.5 清空购物车

CartStore.ets中增加清空方法:

static clearCart() {AppStorage.set('cartStore', [])getContext().eventHub.emit('changeCart')
}

购物车View中增加点击事件:

...
Text('清空购物车').fontColor($r('app.color.search_font_color')).fontSize(12).onClick(() => {CartStore.clearCart()})
...

1.5 购物车数量和价格

在这里插入图片描述

修改MTBottomView,计算购物车数量和价格:

import { FoodItem } from '../models'@Component
export struct MTBottomView {@ConsumeshowCart: boolean@Consume cartList: FoodItem[]// 获取总数量getTotalCount() {return this.cartList.reduce((pre: number, item: FoodItem) => {return pre + item.count}, 0)}// 获取总价格getTotalPrice() {return this.cartList.reduce((pre: number, item: FoodItem) => {return pre + item.count * item.price}, 0)}build() {Row() {// 小哥+角标Badge({ value: this.getTotalCount().toString(), style: { badgeSize: 18 }, position: BadgePosition.Right }) {Image($r('app.media.ic_public_cart')).height(69).width(47).position({y: -20})}.margin({ left: 28, right: 12 }).onClick(() => {this.showCart = !this.showCart})// 金额+描述Column() {Text() {Span('¥').fontColor(Color.White).fontSize(12)Span(this.getTotalPrice().toString()).fontColor(Color.White).fontSize(25)}Text('预估另需配送费¥5').fontColor($r('app.color.search_font_color')).fontSize(12)}.alignItems(HorizontalAlign.Start).layoutWeight(1)// 去结算Text('去结算').width(80).height(50).fontSize(16).backgroundColor($r('app.color.main_color')).textAlign(TextAlign.Center).borderRadius({topRight: 25,bottomRight: 25})}.height(50).width('88%').margin({ bottom: 20 }).backgroundColor(Color.Black).borderRadius(26)}
}

二、小结

  • cartStore应用
  • 加减菜逻辑
  • 购物车逻辑
  • 事件总线

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

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

相关文章

电脑文件夹怎么加密?文件夹加密软件怎么选?

文件夹是管理电脑文件的重要工具&#xff0c;可以避免电脑文件数据混乱。而为了避免文件夹数据泄露&#xff0c;我们需要加密保护文件夹。那么&#xff0c;电脑文件夹怎么加密呢&#xff1f;文件夹加密软件该怎么选择呢&#xff1f;下面我们就来了解一下吧。 如何挑选文件夹加…

我必须要吹一波MATLAB 2024a,太牛逼了!|福利:附安装教程及下载地址

最近逛MATLAB官网&#xff0c;发现MATLAB 2024a版本已经Pre-release了&#xff0c;翻了下release note&#xff0c;不得不感叹&#xff0c;实在是太强了&#xff01; 这次重点更新了四个工具箱&#xff1a; Computer Vision Toolbox Deep Learning Toolbox Instrument Contro…

11.买卖股票的最佳时机Ⅰ

文章目录 题目简介题目解答解法一&#xff1a;一次遍历代码&#xff1a;复杂度分析&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来的是 买卖股票的最佳时机面试题Ⅰ 相关的讲解&#xff01;&#x1f600; 题目简介 题目解答 解法一&#xff1a;一次遍历…

Python计算器程序代码

from tkinter import * import random class App: def __init__(self, master): self.master master self.initwidgets() #表达式的值 self.expr None def initwidgets(self): #定义一个输入组件 self.show Label(relief SUNKEN, font (Courier New, 24), width 25, bg …

Qt Tab键切换焦点顺序:setTabOrder()

使用这个方法setTabOrder()&#xff0c;设置使得焦点的顺序从前到后依次是&#xff1a; ui->lineEdit》 ui->lineEdit_2》ui->lineEdit_3 》ui->lineEdit_4 焦点先在ui->lineEdit上&#xff0c;当按下Tab键时&#xff0c;焦点跑到ui->lineEdit_2上。。。按…

XC7VX690T-2FFG1761I 中文资料 XC7VX690T-2FFG1761引脚图及功能说明

XC7VX690T-2FFG 是由Xilinx&#xff08;赛灵思&#xff09;公司生产的FPGA&#xff08;Field Programmable Gate Array&#xff0c;现场可编程门阵列&#xff09;芯片。FPGA是一种可编程的集成电路&#xff0c;用户可以根据需要将其配置为具有特定逻辑功能的电路。 XC7VX690T-…

windows轻松管理nodejs 版本 升/降级 卸载等等

#nvm-windows 管理nodejs 版本神器# 不经意升级了node版本导致原有项目启动异常, 看到了node版本管理神器:nvm-windos 1,先下载 nvm >> git 选择如下安装包或 nvm-setup.exe文件 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.12 2. 双击安装,下一…

EasyRecovery数据恢复软件2024最新免费无需激活版下载

EasyRecovery数据恢复软件是一款功能强大、操作简便的数据恢复工具&#xff0c;旨在帮助用户解决各种数据丢失问题。无论是由于误删除、格式化、磁盘损坏还是其他原因导致的数据丢失&#xff0c;EasyRecovery都能提供有效的恢复方案。以下是对EasyRecovery软件功能的详细介绍。…

搭建nacos集群

1.修改nacos/conf/application.properties 2.在数据库中执行nacos/conf/nacos-mysql.sql脚本 3.修改nacos/conf/cluster.conf文件 4.修改startup.sh文件模式为集群 5.启动服务 附&#xff1a;安装nginx 修改/usr/local/openresty/nginx/conf/nginx.confi文件 http{}中增加如下…

AnythingLLM+Ollama构建本地知识库

前言 这是一个全栈应用程序&#xff0c;可以将任何文档、资源&#xff08;如网址链接、音频、视频&#xff09;或内容片段转换为上下文&#xff0c;以便任何大语言模型&#xff08;LLM&#xff09;在聊天期间作为参考使用。此应用程序允许您选择使用哪个LLM或向量数据库&#…

新火种AI|正面硬刚OpenAI与谷歌?微软竟然偷偷自研出5000亿参数大模型!

在AI领域&#xff0c;微软公司一直以其独到的创新性和前瞻性而闻名。也正因此&#xff0c;它抢先在AI赛道嗅到商机&#xff0c;并极具预判性的投资了OpenAI&#xff0c;使其成为自己在AI赛道上的最强助力。不过&#xff0c;微软的野心不止于此。 根据The Information 5月6日的…

导电滑环质量如何评估

一. 外观尺寸检测 1. 外观检查 外观检测是导电滑环的基本检测内容之一&#xff0c;包括检查导电滑环是否存在表面损伤、划痕、变形等问题。在外观检测中&#xff0c;还需要关注滑环表面是否平整光洁&#xff0c;导电环和滑动环之间的安装是否牢固&#xff0c;是否有脱落和变形…