【鸿蒙HarmonyOS开发笔记】如何自定义弹窗

创建自定义弹窗

自定义弹窗需要使用@CustomDialog装饰器装饰

在其中需要声明一个controller对象来控制弹窗,对象类型是CustomDialogController

@CustomDialog
export  struct Buttonfc{
  controller: CustomDialogController = new CustomDialogController({ builder: Buttonfc() })

  values:string = ''
  confirm:(value) => void
  build(){
      Column({space:20}){
        Text('请输入答案').fontSize(20)
        TextInput({placeholder:'请输入你的答案'}).type(InputType.Number)
          .onChange((value)=>{
            this.values = value
          })
        Row({space:60}){
          Button('确定').onClick((event: ClickEvent) => {
            this.confirm(this.values)
            this.controller.close()
          })
          Button('取消').onClick((event: ClickEvent) => {
            this.controller.close()
          })
        }
      }.padding(20)
  }
}

在需要使用的组件中,也需要声明一个controller对象来控制弹窗

controller: CustomDialogController = new CustomDialogController({
    builder:Buttonfc({
    confirm:(value)=>{
     	this.answer = value
    }}),
    alignment:DialogAlignment.Bottom,
    offset:{dx:0,dy:-20}
  })

其中confirm是弹窗组件的自定义函数

alignment可以控制弹窗的位置

offset控制弹窗相对位置的偏移量


打开弹窗就在父组件中使用controller.open()

this.controller.open()

关闭弹窗需要在弹窗组件中使用controller.close()

this.controller.close()

完整案例

弹窗组件代码:

@CustomDialog
export  struct Buttonfc{

  controller: CustomDialogController = new CustomDialogController({ builder: Buttonfc() })
  values:string = ''
  confirm:(value) => void
  
  build(){
      Column({space:20}){
        Text('请输入答案').fontSize(20)
        TextInput({placeholder:'请输入你的答案'}).type(InputType.Number)
          .onChange((value)=>{
            this.values = value
          })
        Row({space:60}){
          Button('确定').onClick((event: ClickEvent) => {
            this.confirm(this.values)
            this.controller.close()
          })
          Button('取消').onClick((event: ClickEvent) => {
            this.controller.close()
          })
        }
      }.padding(20)
  }
}


父组件代码:

import { Buttonfc } from './tc'
@Entry
@Component
struct CustomDialogPage {
  @State answer: string = '?'
  Tclist:string[] = ['1','2','3']
  indexs:number = 0
  controller: CustomDialogController = new CustomDialogController({
    builder:Buttonfc({confirm:(value)=>{
      this.answer = value
    }}),
    alignment:DialogAlignment.Bottom,
    offset:{dx:0,dy:-20}
  })

  build() {
    Column({ space: 50 }) {
      Row() {
        Text('1+1=')
          .fontWeight(FontWeight.Bold)
          .fontSize(30)
        Text(this.answer)
          .fontWeight(FontWeight.Bold)
          .fontSize(30)
      }

      Button('作答')
        .onClick(() => {
          //弹窗
          this.controller.open()
        })
    }.width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值