美团外卖-点击加菜和减菜加入购物车

2024-02-18  本文已影响0人  家乡的蝈蝈

1.1、点击加菜和减菜组件加入购物车

  1. 使用Consume接收所有购物车数据
    2.加菜减菜之后提醒父组件更新Provide数据
    3.父组件更新Provide数据
    4.根据数量显示减菜按钮和数量元素
// 加菜和减菜按钮组件
@Component
struct MTAddCut {
  @Consume
  cartList:FoodItem[]
  item:Partial<FoodItem> = {}
  // 获取要显示的数量
  getContent():number {
    // 一开始cartList为空,所以为undefined,所以要加?
    return this.cartList.find(obj => obj.id === this.item.id )?.count || 0
  }
  build() {
    Row({space:8}) {
      Row() {
        Image($r('app.media.ic_screenshot_line'))
          .width(10)
          .aspectRatio(1)
      }
      .width(16)
      .aspectRatio(1)
      .justifyContent(FlexAlign.Center)
      .backgroundColor('#fff')
      .borderRadius(4)
      .border({
        width:0.5,
        color:'#f8c74e'
      })
      .onClick(() => {
        addCutCart('cut', this.item as FoodItem)
      })
      .visibility(this.getContent() ? Visibility.Visible : Visibility.Hidden)
      // this.getContent表示函数,this.getContent()表示调用函数的返回结果
      Text(this.getContent().toString())
        .fontSize(14)
        .visibility(this.getContent() ? Visibility.Visible : Visibility.Hidden)
      Row() {
        Image($r('app.media.ic_public_add_filled'))
          .width(10)
          .aspectRatio(1)
      }
      .width(16)
      .aspectRatio(1)
      .justifyContent(FlexAlign.Center)
      .backgroundColor('#f8c74e')
      .borderRadius(4)
      .onClick(() => {
        addCutCart('add', this.item as FoodItem)
      })
    }
  }
}
// 提供加减购物车的方法
// 既可以加菜又可以减菜
const addCutCart = (type:'add' | 'cut', item:FoodItem) => {
  const list = getCarts()
  const f = list.find(f => f.id === item.id)
  // AlertDialog.show({message:JSON.stringify(f || {} as FoodItem)})
  if (type === 'add') { // 加菜
    if (f) {
      // 找到了
      f.count++
    } else {
      item.count = 1
      list.unshift(item) // unshift在数组头部追加,push在数组尾部追加
    }
  } else { // 减菜
    if (f && f.count > 0) {
      f.count--
      if (f.count === 0) {
        const index = list.findIndex(ff => ff.id === item.id)
        // 移除菜品数据
        list.splice(index, 1)
      }
    }
  }
  // 不管list有没有发生了任何变化
  AppStorage.Set<string>("user_cart", JSON.stringify(list))
}
父组件跟新cartList数据
 @StorageLink("user_cart")
  @Watch("updateCartJSON") // watch必须写在其他修饰符下面-watch第一次不生效
  cartJSON:string = ""
  @Provide
  cartList:FoodItem[] = []
  updateCartJSON() {
    // 此时更新我们的购物车数据
    this.cartList = getCarts() // 反序列化将字符串转成对象
  }
struct MeiTuan {
  @State showCart:boolean = false
  @State list:Category[] = [] // 生命数据结构
  @StorageLink("user_cart")
  @Watch("updateCartJSON") // watch必须写在其他修饰符下面-watch第一次不生效
  cartJSON:string = ""
  @Provide
  cartList:FoodItem[] = []
  updateCartJSON() {
    // 此时更新我们的购物车数据
    this.cartList = getCarts() // 反序列化将字符串转成对象
  }
  // 获取数据,将数据动态渲染
  aboutToAppear() { // 在组件初始化之后,在build之前去执行,只会执行一次
    // 获取美团餐饮数据
    this.getMTData()
    this.updateCartJSON()
  }
}
 // 获取要显示的数量
  getContent():number {
    // 一开始cartList为空,所以为undefined,所以要加?
    return this.cartList.find(obj => obj.id === this.item.id )?.count || 0
  }
 Text(this.getContent().toString())
        .fontSize(14)
        .visibility(this.getContent() ? Visibility.Visible : Visibility.Hidden)
上一篇下一篇

猜你喜欢

热点阅读