鸿蒙购物车布局完成后的点击事件(不怎么通俗易懂)

复制代码
import router from '@ohos.router';
import { ShopCarEntity } from '../../entity/ShopCarEntity';
import LocDataModel from '../../viewmodel/LocDataModel';
import data from '@ohos.telephony.data';

@Entry
@Component
export default struct CarPage {
  @State carList:ShopCarEntity[]=LocDataModel.DEFAULT_SHOP_CART_LIST
  @State totalPrice :number =0
  @State totalCount:number =0

  //计算总价和数量
  countTotalNumber(){
    let tempTotalPrice=0
    let temTotalCount=0

    this.carList.forEach((item:ShopCarEntity)=>{
      if (item.isSelected) {
        tempTotalPrice+=item.goods_default_price*item.count
        temTotalCount+=item.count
      }
    })
    this.totalPrice=tempTotalPrice
    this.totalCount=temTotalCount
  }

  //处理商品单选操作
  carItemSelectChanged(state:boolean,index:number){
    let newCarlist:ShopCarEntity[]=[]
    this.carList.forEach((item:ShopCarEntity,itemIndex:number)=>{
      if (itemIndex===index) {
        item.isSelected=state
        item.itemkey=`${Math.random()*10}-${Math.random()}`
      }
      newCarlist.push(item)
    })
    this.carList=newCarlist
  }
  build() {
     Flex({direction:FlexDirection.Column}){
        //标题部分
        this.TitleBarComponent()
       //商品列表
       this.CarListCompoent()
       //底部
       this.BottomOptionsCompoent()
     }
    .width('100%')
    .height('100%')
    .backgroundColor($r('app.color.page_background'))
  }

  /**
   * 标题
   */
  @Builder TitleBarComponent(){
    Stack({alignContent:Alignment.End}){
      Text('购物车')
        .width('100%')
        .textAlign(TextAlign.Center)
        .fontColor(Color.White)
        .fontSize(16)
        .fontWeight(FontWeight.Bold)

      Text('删除已选')
        .borderWidth(1).
      borderColor(Color.White).
      borderRadius(12).
      fontColor(Color.White).
      fontSize(12).
      fontWeight(FontWeight.Bold)
        .padding({
          top:5,
          right:8,
          bottom:5,
          left:8
        })
        .textAlign(TextAlign.Center)
        .lineHeight(12)
        .margin({
          right:15
        })

    }.width('100%')
    .height('56vp')
    .backgroundColor('#ff0000')
  }
  /**
   * 添加商品数量
   *
   */
  addGoodsCount(index:number){
    let newCarList:ShopCarEntity[]=[]
    this.carList.forEach((item:ShopCarEntity,itemIndex:number)=>{
      if (itemIndex===index) {
        item.count++
        item.itemkey=`${Math.random()*10}-${item.id}-${Math.random()}}`
      }
      newCarList.push(item)
    })
    //重新赋值
    this.carList=newCarList
  }
  /**
   * 减少商品数量
   */
  reduceGoodsCount(index:number){
    let newCarList:ShopCarEntity[]=[]
    this.carList.forEach((item:ShopCarEntity,itemIndex:number)=>{
      if (itemIndex===index) {
        item.count--
        item.itemkey=`${Math.random()*10}-${item.id}-${Math.random()}`
      }
      newCarList.push(item)
    })
    //重新赋值
    this.carList=newCarList
  }
  /**
   * 给itemView生成唯一的key
   *
   */
  generatorItemViewKey(data:ShopCarEntity):string{
    if (data.itemkey) {
      return data.itemkey
    }
    return `${Math.random()*10}*${data.id}--${Math.random()}]`
  }

  /**
   * 商品列表
   */
  @Builder CarListCompoent(){
    Scroll(){
      Column(){
        if (this.carList.length>0){
           List({space:2}){
             ForEach(this.carList,(item:ShopCarEntity,index:number)=>{
               ListItem(){
                 this.CarItemComponent(item,index)
               }

             },(item:ShopCarEntity) => this.generatorItemViewKey(item))
           }
        }else {
          this.EmptyComponent()
        }

      }.width('100%').height('100%')
    }.width('100%')
    .flexGrow(1)

  }
  @Builder
  CarItemComponent(data:ShopCarEntity,index:number){
    Flex({direction:FlexDirection.Row,alignItems:ItemAlign.Center}){
      //复选框
      Checkbox().width(20).height(20).select(true).selectedColor($r('app.color.focus_color'))
        .onChange((value:boolean)=>{
            this.carItemSelectChanged(value,index)

        })

      Image(data.goods_default_icon)
        .margin({left:10,right:10})
        .width(100).height(100).objectFit(ImageFit.Contain).key(data.goods_id.toString())

      //商品描述和价格
      Column(){
        Text(data.goods_desc).fontSize(14).fontColor(Color.Gray).maxLines(2).textOverflow({overflow:TextOverflow.Ellipsis})
        //商品价格
        Text(){
          Span('价格:').fontSize(12).fontColor(Color.Black)
          Span(`${data.goods_default_price}`).fontColor($r('app.color.focus_color')).fontSize(12)
        }.margin({top:5,bottom:5})
        //数量加减
        Row(){
          Text('数量:').fontSize(12).fontColor(Color.Black)
          Counter(){
            Text(`${data.count}`).fontSize(12)
          }.width(100).height(20)
          .onInc(()=>{
            if (data.count<50) {
              this.addGoodsCount(index)
            }
          })
          .onDec(()=>{
            if (data.count>1) {
              this.reduceGoodsCount(index)
            }
          })
          //空白组件
          Blank().layoutWeight(1)
          //当前商品选中时候,才显示
          if (data.isSelected){
             Image($r('app.media.news_selected')).width(15)
               .objectFit(ImageFit.Contain).onClick(()=>{

             })
          }
        }.alignItems(VerticalAlign.Center)
      }.alignItems(HorizontalAlign.Start)
      .margin({right:5})
    }.padding({left:5,right:5})
    .backgroundColor(Color.White)
  }
@Builder EmptyComponent(){
  Column(){
    Column(){

      Image($r('app.media.caca')).width(70).objectFit(ImageFit.Contain)
      Text('欢迎添加购物车!!!').fontColor(Color.Gray).fontSize(14).margin({
        top:5
      })

    }.justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
  }.width('100%')
  .height('100%')
  .justifyContent(FlexAlign.Center)
}
  /**
   * 底部操作
   *
   */
  @Builder BottomOptionsCompoent(){
     Flex({direction:FlexDirection.Row,justifyContent:FlexAlign.SpaceBetween,alignItems:ItemAlign.Center}){
       //全选和总价
       Row(){
         Checkbox()
           .width(15)
           .height(15)
           .select(true).selectedColor($r('app.color.select_color'))
           .onChange((value:boolean)=>{

           })

         Text('全选').fontColor(Color.Gray).fontSize(12)
     //总价
         Text(){
           Span('总价: ').fontColor(Color.Black).fontSize(12).fontWeight(FontWeight.Bold)

           Span('qwqqeqeqeq').fontColor($r('app.color.focus_color')).fontSize(12)

           Span('元').fontColor(Color.Black).fontSize(12).fontWeight(FontWeight.Bold)

           Span('12节').fontColor(Color.Black).fontSize(12).fontWeight(FontWeight.Bold)
         }.margin({left:20})
         .textAlign(TextAlign.Start)
       }
       .margin({left:10})
       .height('100%')



       //立即结算
       Button('立即结算').margin({right:10}).width(80).height(35).fontSize(12).backgroundColor($r('app.color.focus_color')).onClick(()=>{

       })
     }.width('100%')
    .height('50vp')
    .backgroundColor(Color.White)
  }
}
购物车的代码,以及所有的代码点击加减事件结算

这是整体的代码,数量加减和多选删除以及结算

欢迎大家一起讨论,修改和补充代码中的不足之处

相关推荐
久绊A1 小时前
Python 基本语法的详细解释
开发语言·windows·python
小冷爱学习!8 小时前
华为动态路由-OSPF-完全末梢区域
服务器·网络·华为
2501_904447749 小时前
华为发力中端,上半年nova14下半年nova15,大力普及原生鸿蒙
华为·智能手机·django·scikit-learn·pygame
MarkHD9 小时前
第十八天 WebView深度优化指南
华为·harmonyos
塞尔维亚大汉10 小时前
OpenHarmony(鸿蒙南向)——平台驱动开发【MIPI CSI】
harmonyos·领域驱动设计
别说我什么都不会10 小时前
鸿蒙轻内核M核源码分析系列十五 CPU使用率CPUP
操作系统·harmonyos
feiniao865111 小时前
2025年华为手机解锁BL的方法
华为·智能手机
菜鸟单飞12 小时前
介绍一款非常实用的PDF阅读软件!
windows·pdf·电脑
塞尔维亚大汉12 小时前
OpenHarmony(鸿蒙南向)——平台驱动开发【I3C】
harmonyos·领域驱动设计
VVVVWeiYee12 小时前
BGP配置华为——路径优选验证
运维·网络·华为·信息与通信