自定义弹窗如何嵌套使用

自定义弹窗嵌套使用

HarmonyOS
2024-05-26 11:22:13
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
沉默如海

本文主要介绍自定义弹窗如何嵌套使用,即在页面中弹出一个自定义弹窗1,然后在自定义弹窗1中再弹出一个自定义弹窗2,且自定义弹窗1不消失。

典型的使用场景如下:

场景1:在一个业务弹窗中,查看隐私申明,隐私申明以弹窗形式展示

场景2:做删除业务时弹出一个弹出询问是否需要删除,点击删除的话,再弹出一个长在删除的弹窗

使用的核心API

CustomDialogController

核心代码解释

1)通过指南自定义弹窗,我们可以知道,开发自定义弹窗主要需要注意一下几点:

1. 使用@CustomDialog装饰器装饰自定义弹窗,此装饰器内进行自定义内容(也就是弹框内容)。

2. 创建构造器CustomDialogController,与装饰器呼应相连。

3. 组件绑定的onClick中,执行弹窗构造器的open方法使弹窗弹出。

2)实现自定义弹窗1中在弹出一个自定义弹窗2,那么需要按照以上步骤自定义两个Dialog,并创建两个相应的CustomDialogController与之呼应相连,且需要注意两点:

1. 在自定义弹窗1中需要再传入自定义弹窗2的CustomDialogController,用于打开自定义弹窗2。

2. 在自定义弹窗1中,将指向自己的CustomDialogController放在最后,否则会引起崩溃。

3)最后需要注意的是,需要在aboutToDisappear()中,将所有CustomDialogController对象删除和置空,否则可能造成内存泄露。

核心代码如下:

@CustomDialog 
struct MyDialog1 { 
  controller2: CustomDialogController 
  // 指向自己的CustomDialogController放在最后,否则会引起崩溃 
  controller1: CustomDialogController 
  title: string 
 
  build() { 
    Row() { 
      Column({ space: 10 }) { 
        Text(this.title) 
          .fontSize(25) 
          .fontColor(Color.Blue) 
        Button('点击打开弹窗2') 
          .onClick(() => { 
            this.controller2.open() 
          }).backgroundColor(0xffffff).fontColor(Color.Red) 
        Flex({ justifyContent: FlexAlign.SpaceAround }) { 
          Button('confirm') 
            .onClick(() => { 
              this.controller1.close() 
            }).backgroundColor(0xffffff).fontColor(Color.Black) 
        }.width("100%") 
      }.width("50%") 
    }.height("30%") 
  } 
}
// 自定义弹窗组件2 
@CustomDialog 
struct MyDialog2 { 
  controller: CustomDialogController 
  title: string 
  confirm: (data: string) => void 
  data: string = '' 
 
  build() { 
    Row() { 
      Column({ space: 10 }) { 
        Text(this.title) 
          .fontSize(25).fontColor(Color.Blue).margin(20) 
        Text('假设这是一个隐私说明^-^\n假设这是一个隐私说明^-^\n假设这是一个隐私说明^-^\n') 
          .width('90%') 
          .fontSize(20) 
          .fontColor(Color.Gray) 
          .textAlign(TextAlign.Start) 
        TextInput({ placeholder: "传值测试,请输入内容", text: this.data }) 
          .onChange((data) => { 
            this.data = data // 获取输入框数据 
          }).margin({ top: 10 }).fontSize(20) 
        Flex({ justifyContent: FlexAlign.SpaceAround }) { 
          Button('cancel') 
            .onClick(() => { 
              this.controller.close() 
            }).backgroundColor(0xffffff).fontColor(Color.Black) 
          Button('confirm') 
            .onClick(() => { 
              this.confirm(this.data) // 将输入框数据通过回调函数传给主页面 
              this.controller.close() 
            }).backgroundColor(0xffffff).fontColor(Color.Red) 
        }.width("100%") 
      }.margin({ bottom: 10 }) 
    }.height("50%") 
  } 
}
// main页面 
@Entry 
@Component 
struct Index { 
  @State dialogData: string = '' 
  dialogController2: CustomDialogController = new CustomDialogController({ 
    builder: MyDialog2({ 
      title: '弹窗2', 
      data: this.dialogData, 
      confirm: this.confirm.bind(this), // 绑定自定义的回调函数 
    }), 
    customStyle: false, 
    autoCancel: false 
  }) 
  dialogController1: CustomDialogController = new CustomDialogController({ 
    builder: MyDialog1({ 
      controller2: this.dialogController2, 
      title: '弹窗1', 
    }), 
    customStyle: false 
  }) 
 
  confirm(data: string) { 
    this.dialogData = data 
    console.info(`recv dialog data: ${data}`) // 获取弹窗输入的信息 
  } 
 
  // 在自定义组件即将析构销毁时将dialogController删除和置空,否则可能导致内存泄露 
  aboutToDisappear() { 
    // 删除dialogController 
    delete this.dialogController2 
    delete this.dialogController1 
    // 将dialogController置空 
    this.dialogController2 = undefined 
    this.dialogController1 = undefined 
  } 
 
  build() { 
    Row() { 
      Column({ space: 10 }) { 
        Text(`这是一个弹窗嵌套的测试`) 
          .fontSize(25).margin(20).fontColor(0x3399FF) 
        Button('点击打开弹窗1') 
          .onClick(() => { 
            this.dialogController1.open() 
          }) 
        Text(`接受弹窗2的数据:`) 
          .fontSize(20) 
        TextInput({ placeholder: "输入内容", text: this.dialogData }) 
          .onChange((data) => { 
            this.dialogData = data // 获取输入框数据 
          }).margin(10) 
      }.width("100%").borderWidth(2) 
    }.height("100%").backgroundColor(0xffffee) 
  } 
}

实现效果

适配的版本信息

IDE:DevEco    Studio 4.0.3.216

SDK:HarmoneyOS    4.0.0.14


分享
微博
QQ
微信
回复
2024-05-27 11:06:02
相关问题
使用自定义弹窗实现分享弹窗
600浏览 • 1回复 待解决
自定义弹窗使用相关问题
967浏览 • 1回复 待解决
HarmonyOS 使用全局自定义弹窗
70浏览 • 1回复 待解决
自定义弹窗自定义转场动画
1170浏览 • 1回复 待解决
如何设置自定义弹窗位置
2097浏览 • 1回复 待解决
HarmonyOS 如何封装自定义弹窗
14浏览 • 0回复 待解决
如何自定义弹窗中再次弹窗
2323浏览 • 1回复 待解决
HarmonyOS 希望优化自定义弹窗使用
261浏览 • 1回复 待解决
自定义组件嵌套子组件
9555浏览 • 3回复 待解决
HarmonyOS 如何制作自定义加载弹窗
372浏览 • 1回复 待解决
如何自定义popup弹窗的布局?
467浏览 • 2回复 待解决
HarmonyOS 如何设置自定义弹窗透明
35浏览 • 1回复 待解决
HarmonyOS 自定义弹窗选择
398浏览 • 1回复 待解决