自定义弹窗如何嵌套使用

自定义弹窗嵌套使用

HarmonyOS
2024-05-26 11:22:13
1.2w浏览
收藏 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) 
  } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.

实现效果

适配的版本信息

IDE:DevEco    Studio 4.0.3.216

SDK:HarmoneyOS    4.0.0.14


分享
微博
QQ
微信
回复
2024-05-27 11:06:02


相关问题
使用自定义弹窗实现分享弹窗
1111浏览 • 1回复 待解决
HarmonyOS 使用全局自定义弹窗
522浏览 • 1回复 待解决
自定义弹窗使用相关问题
1410浏览 • 1回复 待解决
自定义弹窗自定义转场动画
1633浏览 • 1回复 待解决
如何自定义弹窗中再次弹窗
2788浏览 • 1回复 待解决
HarmonyOS 如何封装自定义弹窗
583浏览 • 1回复 待解决
如何设置自定义弹窗位置
2474浏览 • 1回复 待解决
HarmonyOS 自定义弹窗如何更新弹窗的UI
586浏览 • 1回复 待解决
自定义组件嵌套子组件
10028浏览 • 3回复 待解决
HarmonyOS 希望优化自定义弹窗使用
651浏览 • 1回复 待解决
HarmonyOS 自定义弹窗选择
974浏览 • 1回复 待解决
HarmonyOS 如何设置自定义弹窗透明
542浏览 • 1回复 待解决
HarmonyOS 自定义弹窗CustomDialog
486浏览 • 1回复 待解决
如何自定义popup弹窗的布局?
744浏览 • 2回复 待解决
HarmonyOS 如何制作自定义加载弹窗
898浏览 • 1回复 待解决