【鸿蒙实战开发】HarmonyOS实现购物车模块

200 篇文章 0 订阅
200 篇文章 0 订阅
背景

最近逛论坛和各种技术站发现大家对商城类应用搜索的频率非常高,在商城开发领域深耕多年的我为了造福一方码农,不得不出手相助了,那么今天就为大家带来商城应用开发中比较重要的一个功能模块,就是我们的购物车模块,购物车模块主要负责已添加商品的数量以及选中状态的查看以及我们商品价格的计算,首先让我们看效果图

image.png

可以看到这是某平台的购物车效果图,分别有商品选择和价格计算两个模块。在其他平台想必大家开发起来早已经烂熟于心,那在我们的HarmoneyOS上又该如何实现呢?

开发准备
硬件:

支持api12的HarmoneyOS NEXT系统的手机或者平板

软件:

DevEco Studio NEXT 5.0.3.403

Api 12语言: 方舟编程语言(ArkTs)

UI开发框架:

方舟UI框架,ArkUI

开发分析

购物车有商品列表和价格计算,所以我们的组件结构是在自定义组件中使用list列表实现商品分类,在自定义价格计算组件中去实时计算列表中随动的商品价格

代码实现

首先定义好我们需要的变量,一个商品总价和商品流的详情,因为我们需要改变数组中对象的数据所以我们需要用到@ObjectLink + @Observed ,@Observed声明的实体类如下

@State allMoney:number=0//已选商品总价
 @Observed
export class Product {
  checked: boolean;
  name: string;
  price: number;
  num: number;
  id: number;
  img: string;

  constructor(
    checked: boolean,
    name: string,
    price: number,
    num: number,
    id: number,
    img: string
  ) {
    this.checked = checked;
    this.name = name;
    this.price = price;
    this.num = num;
    this.id = id;
    this.img = img;
  }
}

然后我们在页面的生命周期中填充数据

aboutToAppear(): void {
    let product1: Product = new Product(true,
坚果',
     9,
     1,
     0,
     'https://tse2-mm.cn.bing.net/th/id/OIP-C.2gR5bCXHLK6Pi4CMzt5XnQHaE8?w=372&h=203&c=7&r=0&o=5&dpr=2&pid=1.7')
    let product2: Product = new Product( true,
小零食',
      19,
      1,
      0,
      'https://tse2-mm.cn.bing.net/th/id/OIP-C.2gR5bCXHLK6Pi4CMzt5XnQHaE8?w=372&h=203&c=7&r=0&o=5&dpr=2&pid=1.7')

    this.productList.push(product1)
    this.productList.push(product2)

    this.allMoney= this.areAllCheckTrue(this.productList)

  }

数据准备好后使用list组件进行数据的填充并且加入布局展示数据(代码如下)

List(){
ForEach(this.productList,(item:ESObject,index:number)=>{
ListItem(){
           //自定义组件
  itemList({item:item,index:index,call:()=>{
             this.allMoney= this.areAllCheckTrue(this.productList)
            }})
}

})
}
.margin({top:10})

条目信息我们创建一个自定义组件来实现(代码如下)

@Component
export  struct itemList{
  @ObjectLink item:Product
  @State index:number=0;
  call:()=>void=()=>{}
  build() {
    Row(){
      Checkbox({ name: 'checkbox1', group: 'checkboxGroup'+this.index })
        .select(true)
        .selectedColor(0xed6f21)
        .shape(CheckBoxShape.CIRCLE)
        .onChange((value: boolean) => {
          this.item.checked=value
          this.call()
          console.info('Checkbox1 change is' + value)
        })

      Image( this.item.img)
        .height(90)
        .width(90)
      Column(){
        Text( this.item.name)
          .fontSize(16)
          .fontWeight(FontWeight.Bold)

        Text(){
          Span("¥")
            .fontColor(Color.Red)
          Span(String( this.item.price))
            .fontColor(Color.Red)

        }
        .margin({top:40})
      }
      .margin({left:10})

      Blank()

      Row(){
        Button("+")
          .width(40)
          .height(20)
          .fontColor(Color.White)
          .onClick(()=>{
            this.item.num++
            this.call()

          })

        Text(String( this.item.num))
        Button("-")
          .width(40)
          .height(20)
          .fontColor(Color.White)
          .onClick(()=>{
            this.item.num--
            this.call()

          })
      }
    }
    .width('100%')
    .justifyContent(FlexAlign.SpaceBetween)
  }

}

这时候我们的购物车数据就显示出来了(效果如下)

image.png

接下来实现底部的价格计算模块

Row(){
总价:")
        Text(String(this.allMoney))
          .fontSize(20)
          .fontColor(Color.Red)
        Blank()
结算")
          .fontColor(Color.White)
          .backgroundColor(Color.Red)
      }
      .margin({bottom:10})
      .padding({left:10,right:10})
      .width('100%')
      .justifyContent(FlexAlign.SpaceBetween)

​保存后效果如下
image.png

​然后定义价格计算的方法实现

areAllCheckTrue(products: Product[]): number {
    let all:number=0
  for (const product of products) {
    if (product.checked) {
      all+=product.price*product.num
    }
  }
  return  all;
}

通过遍历数组的数据拿到商品价格与数量的结果,然后在页面上赋值给我们定义的总价参数。
image.png

现在购物车的选择,添加,价格计算就实现啦

写在最后

●如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
●点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
●关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
●更多鸿蒙最新技术知识点,请移步前往小编:https://gitee.com/

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值