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

news2024/12/24 8:21:19

目录

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

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')
  }
}

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

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

相关文章

SHELL脚本学习(十二)sed进阶

一、多行命令 概述 sed 编辑器的基础命令都是对一行文本进行操作。如果要处理的数据分布在多行中,sed基础命令是没办法处理的。 幸运的是,sed编辑器的设计人员已经考虑了这个问题的解决方案。sed编辑器提供了3个处理多行文本的特殊命令。 命令描述N加…

提高LabVIEW程序可靠性

​提高LabVIEW程序的可靠性是确保系统稳定运行、减少故障和维护成本的重要措施。以下从多个方面详细分析如何提高LabVIEW程序的可靠性 1. 选择合适的架构 1.1 状态机架构 适用情况: 多状态、多步骤操作。 具体例子:在一个自动测试系统中,…

我在高职教STM32——时钟系统与延时控制(1)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就…

44.商城系统(二十五):k8s基本操作,ingress域名访问,kubeSphere可视化安装

上一章我们已经配置好了k8s集群,如果没有配置好先去照着上面的配。 一、k8s入门操作 1.部署一个tomcat,测试容灾恢复 #在主机器上执行 kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8#查看k8s中的所有资源 kubectl get all kubectl get all -o wide#查看po…

VsCode:配置TypeScript开发环境

一、前提 电脑已经安装了npm 何如安装npm,请点击查看Node.js、npm常用命令、安装多个node版本 提醒:下文讲解操作是在mac 系统进行的,TypeScript简称:ts 二、安装TypeScript 在终端里执行命令:npm install -g typescr…

LLM大模型实战 —— DB-GPT阿里云部署指南

简介: DB-GPT 是一个实验性的开源应用,它基于FastChat,并使用vicuna-13b作为基础模型, 模型与数据全部本地化部署, 绝对保障数据的隐私安全。 同时此GPT项目可以直接本地部署连接到私有数据库, 进行私有数据处理, 目前已支持SQL生…

Swift 6:导入语句上的访问级别

文章目录 前言示例启用 AccessLevelOnImport破坏性变更采用这些更改总结前言 SE-0409 提案引入了一项新功能,即允许使用 Swift 的任何可用访问级别标记导入声明,以限制导入的符号可以在哪些类型或接口中使用。由于这些变化,现在可以将依赖项标记为对当前源文件(private 或…

数据分析三剑客-Matplotlib

数据分析三剑客 数据分析三剑客通常指的是在Python数据分析领域中,三个非常重要的工具和库:Pandas、NumPy和Matplotlib。Pandas主要负责数据处理和分析,NumPy专注于数值计算和数学运算,而Matplotlib则负责数据可视化。这三个库相…

友力科技广州数据中心搬迁

搬迁工作内容 1.搬迁技术工作 1)确定机房搬迁的负责人以及负责人的联系方式,保证在搬迁的过程中统一指挥管理。 2)确定服务器的数量,服务器的型号,服务器的配置等,如有需要,联系相关服务器的供货商或者厂家提供技术支持…

HBuilder X 小白日记01

1.创建项目 2.右击项目&#xff0c;可创建html文件 3.保存CtrlS&#xff0c;运行一下 我们写的内容&#xff0c;一般是写在body里面 注释的快捷键&#xff1a;Ctrl/ h标签 <h1> 定义重要等级最高的(最大)的标题。<h6> 定义最小的标题。 H标签起侧重、强调的作用…

Pinia详解

文章目录 简介特点用法1. 安装Pinia2. 注册Pinia Store3. 创建Pinia Store4. 使用Pinia Store 区别 Vuex详解 Pinia是一个基于Vue 3的状态管理库&#xff0c;专为Vue 3设计。它提供了一种简单、直观且可扩展的方式来组织和访问应用程序的状态。Pinia的设计灵感来源于Vuex&#…

数据资产管理的艺术:构建智能化、精细化的数据资产管理体系,从数据整合、分析到决策支持,为企业提供一站式的数据资产解决方案,助力企业把握数字时代的新机遇

一、引言 在数字化浪潮席卷全球的今天&#xff0c;数据已经成为企业最重要的资产之一。如何高效、安全地管理这些海量数据&#xff0c;从中提取有价值的信息&#xff0c;并将其转化为决策支持&#xff0c;是每个企业都必须面对的挑战。本文将探讨数据资产管理的艺术&#xff0…

中国高分辨率土壤质地数据(1KM)

土壤中各粒级占土壤重量的百分比组合&#xff0c;叫做土壤质地。土壤质地是土壤的最基本物理性质之一&#xff0c;对土壤的各种性状&#xff0c;如土壤的通透性、保蓄性、耕性以及养分含量等都有很大的影响是评价土壤肥力和作物适宜性的重要依据。 中国土壤质地空间分布数据是根…

ChatTTS超真实自然的语音合成模型

项目介绍 ChatTTS是一款专为优化对话场景而生的语音生成模型&#xff0c;尤其匹配大型语言模型&#xff08;LLM&#xff09;的交互需求&#xff0c;以及生成对话式音频、视频旁白等应用场景&#xff0c;无缝覆盖中英文双语。 通过汲取约100,000小时的高质量中英语音数据进行深…

全球首个真人级数字人,开源了!

全球首个2D真人级AIGC**实时渲染数字人模型开源了&#xff01; 这是数字人技术界的一次大爆炸&#xff0c;我们即将迈入一个全新的交互时代&#xff0c;一个由数字人代理引领的时代。 DUIX&#xff08;Dialogue User Interface System&#xff09;&#xff0c;这个由硅基智能…

Unity的Excel转表工具

该Excel工具主要由Python语言完成&#xff0c;版本为3.x 主要功能&#xff1a; 1.转换后的数据存储结构为二进制。 2.excel文件可以选择多种数据类型&#xff1a;int、float、string、一维&#xff08;int、float、string&#xff09;、二维int、Map&#xff08;int/int、in…

杂谈咋说-事业编与公务员建议收藏!

杂谈咋说-事业编与公务员建议收藏&#xff01; 什么是铁饭碗 在中国&#xff0c;「铁饭碗」这个词常常被用来形容那些稳定、有保障的工作。 当我们谈论"铁饭碗"时&#xff0c;人们往往会将公务员和事业编制人员进行比较。 尽管这两者都是相对稳定的工作&#xff…

从单一到多元:EasyCVR流媒体视频汇聚技术推动安防监控智能升级

随着科技的飞速发展&#xff0c;视频已成为我们日常生活和工作中的重要组成部分。尤其在远程办公、在线教育、虚拟会议等领域&#xff0c;视频的应用愈发广泛。为了满足日益增长的视频需求&#xff0c;流媒体视频汇聚融合技术应运而生&#xff0c;它不仅改变了传统视频的观看和…

已解决javax.transaction.InvalidTransactionException:事务无效的正确解决方法,亲测有效!!!

已解决javax.transaction.InvalidTransactionException&#xff1a;事务无效的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 1. 确保事务的正确启动和结束 Spring中的事务管理 2. 避免嵌套事务问题…

第五节:如何使用其他注解方式从IOC中获取bean(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;上节我们实践了通过Bean方式声明Bean配置。咱们这节通过Component和ComponentScan方式实现一个同样功能。这节实现的效果是从IOC中加载Bean对象&#xff0c;并且将Bean的属性打印到控制台。 第一步&#xff1a;创建pojo实体类studen…