使用鸿蒙HarmonyOs NEXT 开发 快速开发 简单的购物车页面

目录

资源准备:需要准备三张照片:商品图、向下图标、金钱图标

1.显示效果:

2.源码:


资源准备:需要准备三张照片:商品图、向下图标、金钱图标

1.显示效果:


定义了一个购物车页面的布局,包括以下几个部分:

1. 每个商品都有一个复选框来表示选择状态,一个图片来展示商品,以及商品描述、规格、标签和价格。

2. 用户可以通过点击减号或加号来调整商品数量。

3. 显示已选商品数量和总金额,以及一个结算按钮。

在每个商品行中,当用户点击复选框时,会更新商品的选择状态、总金额和总选中商品数量。当用户调整商品数量时,也会相应地更新总金额。

在结算行中,显示了用户已选择的商品数量和总金额。

请注意,这个代码示例是一个简化的版本,实际应用中可能需要更多的逻辑来处理全选功能、商品数量的限制、价格计算等。此外,您可能还需要与后端服务交互来更新购物车的状态。

2.源码:

@Entry
@Component
struct Index {
  @State pantValue:number = 69.98 // 商品单价
  @State amount:number = 0 // 总金额
  @State count:number = 1 // 商品数量
  @State selectPant:boolean = false // 商品是否选中
  @State totalCount:number = 0 // 总选中商品数量

  build() {
    // 整个页面的垂直布局
    Column(){
      // 商品行的布局
      Row({space:5}){
        // 商品选择复选框
        Checkbox()
          .width(15)
          .onClick(()=>{
            // 当复选框点击时,更新金额和选中状态
            if(!this.selectPant){
              this.amount += this.count * this.pantValue
              this.selectPant = true
              this.totalCount +=1
            }else{
              this.amount -= this.count * this.pantValue
              this.selectPant = false
              this.totalCount -=1
            }
          })

        // 商品图片的布局
        Column(){
          Image($r('app.media.shop_pant'))
            .width(80)
            .borderRadius(10)
            .backgroundColor(Color.Brown)
        }.height('100%')

        // 商品描述的布局
        Column(){
          // 商品名称
          Row(){
            Text(){
              Span('开学季 ')
                .fontColor(Color.Red)
                .fontSize(20)
              Span('三条杠运动卫裤男春秋百搭宽松裤')
            }
            .textOverflow({overflow:TextOverflow.Clip})
            .maxLines(1)
          }

          // 商品规格
          Text('S668黑色,XL[码(对应32-33)]')
            .textOverflow({overflow:TextOverflow.Clip})
            .maxLines(1)

          // 商品标签
          Flex({
            direction:FlexDirection.Row,
            wrap:FlexWrap.Wrap
          }){
            Text('每200减20')
              .margin({right:5})
              .fontColor('#fff16706')
            Text('假一赔四')
              .fontColor('#fff16706')
            Text('极速退款')
              .fontColor('#fff16706')
          }
          .padding(3)
          .width('100%')

          // 商品价格
          Row({space:5}){
            Image($r('app.media.money'))
              .width(16)
              .fillColor('#e6f51905')
            Text(){
              Span(this.pantValue.toFixed(2).split('.')[0].toString())
                .fontSize(24)
              Span('.')
                .fontSize(24)
              Span(this.pantValue.toFixed(2).split('.')[1].toString())
                .fontSize(18)
            }
            .fontColor('#e6f51905')

          }.width('100%')



        }.layoutWeight(1)
        .height('100%')

        // 商品数量调整的布局
        Column(){
          Row({space:5}){
            // 减少商品数量的按钮
            Text('-')
              .fontSize(25)
              .border({
                width:{top:1,left:1,bottom:1},
                style:BorderStyle.Dotted
              })
              .borderRadius({
                topLeft:10,
                bottomLeft:10
              }).padding({left:3,right:3})
              .onClick(()=>{
                // 减少商品数量,并更新金额
                if(this.count >1){
                  this.count -= 1
                  if (this.selectPant) {
                    this.amount -= this.pantValue
                  }

                }else{
                  AlertDialog.show({message:'商品数量至少为1哦!'})
                }

              })

            // 显示商品数量的文本
            Text(this.count.toString())
              .fontSize(25)
              .border({
                width:1,
                style:BorderStyle.Dotted
              }).padding({left:3,right:3})

            // 增加商品数量的按钮
            Text('+')
              .fontSize(25)
              .border({
                width:{top:1,right:1,bottom:1},
                style:BorderStyle.Dotted
              })
              .borderRadius({
                topRight:10,
                bottomRight:10
              })
              .padding({left:3,right:3})
              .onClick(()=>{
                // 增加商品数量,并更新金额
                this.count += 1
                if (this.selectPant) {
                  this.amount += this.pantValue
                }

              })

          }

          // 下拉箭头图标
          Image($r('app.media.ic_public_arrow_down_0'))
            .width(20)
        }
        .height('100%')
        .alignItems(HorizontalAlign.Start)

      }
      .height(130)
      .padding(5)
      .width('100%')
      .backgroundColor(Color.White)

      // 占位符,用于在布局中创建空间
      Blank()

      // 结算行的布局
      Row(){
        // 全选复选框和文本
        Row({space:5}){
          Checkbox()
            .width(14)
          Text('全选')
            .fontSize(16)
        }

        // 占位符,用于在布局中创建空间
        Blank()

        // 结算信息布局
        Row(){
          // 显示已选商品数量和总金额
          Text('已选'+this.totalCount+'件 ')
            .fontColor(Color.Gray)
            .fontSize(14)
          Text('合计: ')
            .fontSize(14)
          Image($r('app.media.money'))
            .width(12)
            .fillColor('#e6f51905')
          Text(){
            Span(this.amount.toFixed(2).split('.')[0].toString())
              .fontSize(26)
            Span('.')
              .fontSize(26)
            Span(this.amount.toFixed(2).split('.')[1].toString())
              .fontSize(18)
          }
          .fontColor('#e6f51905')

        }.margin({left:10})

        // 结算按钮
        Button('结算')
          .width(100)
          .height(50)
          .backgroundColor('#ffff4801')
          .margin({left:10})

      }
      .padding(10)
      .height(100)
      .width('100%')
      .backgroundColor(Color.White)
      .borderRadius({
        topLeft:25,
        topRight:25
      })

    }
    .height('100%')
    .width('100%')
    .backgroundColor('#fff3f1f1')
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[方法] Unity 3D模型与骨骼动画

1. 在软件中导出3D模型 1.1 3dsmax 2014 1.1.1 TGA转PNG 3dsmax的贴图格式为tga,我们需要在在线格式转换中将其转换为Unity可识别的png格式。 1.1.2 模型导出 导出文件格式为fbx。在导出设置中,要勾选三角算法,取消勾选摄像机和灯光&#…

mysql解压版本安装5.7

1. 官网下载好解压版本 我这边5.7版本 https://dev.mysql.com/downloads/file/?id523570 mysql官网 创建 my.ini文件 内容如下 [client] #客户端设置,即客户端默认的连接参数# socket /data/mysqldata/3306/mysql.sock #用于本地连接的socket套接字 # 默…

运维锅总详解HAProxy

本文尝试从HAProxy简介、HAProxy工作流程及其与Nginx的对比对其进行详细分析;在本文最后,给出了为什么Nginx比HAProxy更受欢迎的原因。希望对您有所帮助! HAProxy简介 HAProxy(High Availability Proxy)是一款广泛使…

【知识学习】阐述Unity3D中Profile和性能的概念及使用方法示例

在Unity3D中,"Profile"和"性能"是两个相关但不同的概念,它们在游戏开发中扮演着重要的角色。 Profile(配置文件) "Profile"在Unity中通常指的是一种配置文件,它包含了一系列的设置和参…

JAVA医院绩效考核管理系统源码:系统优势、系统目的、系统原则 (自主研发 功能完善 可直接上项目)

JAVA医院绩效考核管理系统源码:系统优势、系统目的、系统原则 (自主研发 功能完善 可直接上项目) 医院绩效考核系统优势 1.实现科室负责人单独考核 对科室负责人可以进行单独考核、奖金发放。 2. 科室奖金支持发放到个人 支持奖金二次分配&…

Numpy array和Pytorch tensor的区别

1.Numpy array和Pytorch tensor的区别 笔记来源: 1.Comparison between Pytorch Tensor and Numpy Array 2.numpy.array 4.Tensors for Neural Networks, Clearly Explained!!! 5.What is a Tensor in Machine Learning? 1.1 Numpy Array Numpy array can only h…

已解决问题 | 该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的

在Chrome浏览器中,如果你看到“该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的”这样的提示,通常是因为该扩展程序没有通过Chrome网上应用店进行安装。以下是解决这个问题的步骤: 解决办法:…

Bridging nonnull in Objective-C to Swift: Is It Safe?

Bridging nonnull in Objective-C to Swift: Is It Safe? In the world of iOS development, bridging between Objective-C and Swift is a common practice, especially for legacy codebases (遗留代码库) or when integrating (集成) third-party libraries. One importa…

uniapp+vue3开发微信小程序踩坑集

本文主要记录使用uniappvue3开发微信小程序遇见的各种常见问题及注意点。(持续更新) 问题: 自定义组件为什么有些样式加不上去 给自定义组件增加class的时候,有时候不生效有时候生效,一度让我怀疑自己记忆错乱。后来…

揭秘Etched AI:三个哈佛辍学00后挑战英伟达,推出Transformer专用ASIC芯片sohu

人工智能领域最近掀起了一股新的热潮,三位哈佛辍学的00后本科生创建了Etched AI,并成功推出了一款超强AI芯片sohu,直指英伟达的AI芯片帝国。这款芯片被誉为比英伟达H100快20倍,吸引了众多科技界的关注。本文将深入探讨Etched AI及…

css 布局出现无法去除的空白

案件介绍&#xff1a;在没有设置任何的css样式的情况下 文字顶部出现无法去除的空白 源代码 <div click"onClick" ><div class"tableTextButton--container"></div><Icon v-if"loading || thisLoading" type"ios-lo…

springboot的特点是什么?

Spring Boot是一个基于Spring框架的开源项目&#xff0c;它旨在简化Spring应用的初始搭建和开发过程。以下是Spring Boot的一些主要特点&#xff1a; 快速开发&#xff1a; Spring Boot提供了许多默认配置&#xff0c;使得开发者可以更快地开始开发应用程序&#xff0c;而无需…

Linux Doxygen快速生成文档

此前写过一篇编写Doxygen格式的注释以用于生成文档,点击以查阅, Doxygen常用语法与字段记录,但是当时用的windows桌面版的doxygen,最近使用ubuntu编写代码想直接使用doxygen生成,故写下此博客 Doxygen Doxygen是一个用于生成软件文档的工具&#xff0c;它可以从代码中提取注释…

工业自动化控制中心

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms;namespace 工业自动化控制中心 {public partial class Form1 : Form{public Form1(){InitializeComponent();}pri…

【智能算法】目标检测算法

目录 一、目标检测算法分类 二、 常见目标检测算法及matlab代码实现 2.1 R-CNN 2.1.1 定义 2.1.2 matlab代码实现 2.2 Fast R-CNN 2.2.1 定义 2.2.2 matlab代码实现 2.3 Faster R-CNN 2.3.1 定义 2.3.2 matlab代码实现 2.4 YOLO 2.4.1 定义 2.4.2 matlab代码实现…

boost asio异步服务器(4)处理粘包

粘包的产生 当客户端发送多个数据包给服务器时&#xff0c;服务器底层的tcp接收缓冲区收到的数据为粘连在一起的。这种情况的产生通常是服务器端处理数据的速率不如客户端的发送速率的情况。比如&#xff1a;客户端1s内连续发送了两个hello world&#xff01;,服务器过了2s才接…

昇思25天学习打卡营第11天|SSD目标检测

1. 学习内容复盘 模型简介 SSD&#xff0c;全称Single Shot MultiBox Detector&#xff0c;是Wei Liu在ECCV 2016上提出的一种目标检测算法。使用Nvidia Titan X在VOC 2007测试集上&#xff0c;SSD对于输入尺寸300x300的网络&#xff0c;达到74.3%mAP(mean Average Precision)…

amis源码 更新组件数据域的几种方法

更新组件数据域的几种方法&#xff1a; 默认都是合并数据&#xff0c;非覆盖(指定replace为true的才是覆盖)&#xff1a; const comp amisScoped.getComponentById(id);//或者getComponentByName(name) 1.comp.setData(values, replace); //更新多个值values&#xff0c; r…

开启网络监控新纪元:免费可视化工具助力网络信息链路拓扑监控大屏

在数字化浪潮汹涌的今天&#xff0c;网络已成为我们生活、工作的不可或缺的一部分。然而&#xff0c;你是否曾经想过&#xff0c;在这个庞大的网络世界中&#xff0c;是谁在默默守护着每一条信息的传输&#xff0c;确保我们的数据安全、稳定地抵达目的地&#xff1f; 网络信息链…

昇思MindSpore学习总结五——网络构建

1、网络构建 神经网络模型是由神经网络层和Tensor操作构成的&#xff0c;mindspore.nn提供了常见神经网络层的实现&#xff0c;在MindSpore中&#xff0c;Cell类是构建所有网络的基类&#xff0c;也是网络的基本单元。一个神经网络模型表示为一个Cell&#xff0c;它由不同的子C…