#鸿蒙通关秘籍#如何在HarmonyOS Next中实现购物车功能,并使用状态管理添加和删除商品?

HarmonyOS
19h前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
ByteBaron

要在HarmonyOS Next中创建一个包含购物车功能的应用,需要利用状态管理来动态更新商品数量。定义一个包含商品信息的状态对象Commodity,并通过+-按钮触发数量的增加和减少。以下是实现购物车界面的完整代码:

interface Commodity {
  img: Resource,
  name: string,
  introduce: string,
  oldPrice: number,
  price: number,
  num: number,
}

@Entry
@Component
struct Index {
  @State Dog: Commodity = {
    img: $r('app.media.test2'),
    name: '狗头',
    introduce: '这是一个滑稽的狗头',
    oldPrice: 99,
    price: 9.9,
    num: 0,
  }

  build() {
    Column() {
      Scroll(){
        Row(){
          Image(this.Dog.img)
            .size({ width: 120, height: 80 })
            .borderRadius(10)
            .margin({ right: 10 })
          
          Column(){
            Row(){
              Text(this.Dog.name)
                .fontSize(18)
                .fontColor('#333')
            }
            Row(){
              Text(this.Dog.introduce)
                .fontSize(16)
                .fontColor('#aaa')
                .lineHeight(30)
            }
            Row(){
              Text(`¥${this.Dog.price}`)
                .fontSize(22)
                .fontWeight(FontWeight.Bold)
                .fontColor(Color.Red)
              
              Text(`¥${this.Dog.oldPrice}`)
                .fontSize(18)
                .fontColor('#999')
                .margin({left: 10})
                .decoration({
                  type: TextDecorationType.LineThrough
                })
              
              Text('+')
                .width(15)
                .height(20)
                .margin({ left:30 })
                .border({
                  width: 1,
                  color: '#aaa',
                  style: BorderStyle.Solid,
                  radius: { topLeft:3, bottomLeft:3 }
                })
                .fontColor('#333')
                .fontSize(16)
                .fontWeight(FontWeight.Bold)
                .textAlign(TextAlign.Center)
                .onClick(()=>{
                  this.Dog.num++
                })
              
              Text(this.Dog.num + '')
                .height(20)
                .border({
                  width: 1,
                  color: '#aaa',
                  style: BorderStyle.Solid,
                })
                .padding({ left: 5, right: 5 })
              
              Text('-')
                .width(15)
                .height(20)
                .border({
                  width: 1,
                  color: '#aaa',
                  style: BorderStyle.Solid,
                  radius: { topRight:3, bottomRight:3 }
                })
                .fontColor('#333')
                .fontSize(16)
                .fontWeight(FontWeight.Bold)
                .textAlign(TextAlign.Center)
                .onClick(()=>{
                  if(this.Dog.num >= 1)
                    this.Dog.num--
                })
            }
          }
          .alignItems(HorizontalAlign.Start)
          .layoutWeight(1)
        }
        .alignItems(VerticalAlign.Top)
        .width('100%')
        .backgroundColor('#ddd')
        .padding(20)
      }
      .backgroundColor('#eee')
      .align(Alignment.Top)
      .layoutWeight(1)
      
      Row(){
        Column(){
          Row(){
            Text(`已选${this.Dog.num}件,`)
              .fontColor('#666')
            Text('合计:')
            Text(`¥${this.Dog.num * this.Dog.price}`)
              .fontColor(Color.Red)
          }
          Row(){
            Text(`共减¥${(this.Dog.oldPrice - this.Dog.price) * this.Dog.num}`)
              .fontSize(14)
              .lineHeight(18)
              .fontColor(Color.Red)
          }
        }
        .alignItems(HorizontalAlign.End)
        .layoutWeight(1)
        
        Button('结算外卖')
          .margin({ left: 20 })
      }
      .height(100)
      .padding(20)
      .backgroundColor(Color.White)
      .width('100%')
    }
  }
}
分享
微博
QQ
微信
回复
19h前
相关问题