食物列表-底部Panel

本页面实现通过点击任意食物,出现可以显示详细信息面板。

首先生成面板,使用@State showPanel ,并且通过onPanelShow 控制面板,定义无参函数:

 showPanel:()=> void//定义无参函数
 @State showPanel:boolean = false

  onPanelShow(){//控制面板
    this.showPanel = true
  }

底部面板的具体实现:

//3.底部面板
        Panel(this.showPanel){
          Button('关闭').onClick(()=> this.showPanel=false)
        }
        .mode(PanelMode.Full)//展示部分
        .dragBar(false)//高度
        .backgroundMask($r('app.color.light_gray'))//蒙版颜色
        .backgroundColor(Color.White)

打开面板的实现:

.onClick(()=> this.showPanel)//点击打开面板

在ItemPanelHeader中,这部分作为面板最头部,以文字和图片的形式展现:

export default struct ItemPanelHeader {
  build() {
    Row(){
      Text('2024年1月25日  早餐')
        .fontSize(18).fontWeight(CommonConstants.FONT_WEIGHT_600)
      Image($r('app.media.ic_public_spinner'))
        .width(20)
        .fillColor(Color.Black)
    }
  }
}

在ItenCard中详细实现具体内容部分:其中定义了状态变量 amount ,它是用户随机改变的

export default struct ItemCard {

  @Prop amount:number//状态变量,随时改变

  build() {
    Column({space:CommonConstants.SPACE_8}) {
      //1.图片信息
      Image($r('app.media.toast')).width(150)
      //2.名称信息
      Row() {
        Text('全麦吐司').fontWeight(CommonConstants.FONT_WEIGHT_700)
      }
      .backgroundColor($r('app.color.lightest_primary_color'))
      .padding({ top: 5, bottom: 5, left: 12, right: 12 })
      Divider().width(CommonConstants.THOUSANDTH_940).opacity(0.6)
      //3.营养素信息
      Row({space:CommonConstants.SPACE_8}){
        this.NutruentInfo('热量(千卡)',91.0)
        this.NutruentInfo('碳水(克)',15.5)
        this.NutruentInfo('蛋白质(克)',4.4)
        this.NutruentInfo('脂肪(克)',1.3)
      }
      Divider().width(CommonConstants.THOUSANDTH_940).opacity(0.6)
      //4.数量信息
      Row(){
        Column({space:CommonConstants.SPACE_4}){
          Text(this.amount.toFixed(1)).fontSize(50).fontColor($r('app.color.primary_color'))
            .fontWeight(CommonConstants.FONT_WEIGHT_600)
          Divider().color($r('app.color.primary_color'))
        }
        .width(150)
        Text('片')
          .fontColor($r('app.color.light_gray'))
          .fontWeight(CommonConstants.FONT_WEIGHT_600)
      }
    }
  }

  @Builder NutruentInfo(label:string,value:number){
    Column({space:CommonConstants.SPACE_8}){
      Text(label).fontSize(14).fontColor($r('app.color.light_gray'))
      Text(value.toFixed(1)).fontSize(18).fontWeight(CommonConstants.FONT_WEIGHT_700)
    }
  }
}

在调用时发现面板显示不出来,于是需要在ItenList 中添加 layoutWeight ,通过设置列表,其余用来显示面板则则可以实现:

//2.列表
        ItemList({showPanel:this.onPanelShow.bind(this) })
        .layoutWeight(1)//
        //3.底部面板
        Panel(this.showPanel){
          //3.1顶部日期
          ItemPanelHeader()
          //3.2记录项卡片
          ItemCard({amount:this.amount})

最终:

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值