ArkUI AlertDialog:确认弹窗别一上来就吓人

举报
蓝瘦的蜕变 发表于 2026/09/08 18:40:58 2026/09/08
【摘要】 今天我们用 AlertDialog 做三种确认场景:单按钮说明、双按钮选择、危险操作确认。 AlertDialog 会打断用户当前动作,所以我们别把它当成普通提示来用。只有用户需要做决定,或者必须看清楚后果时,它才值得出现。 单按钮说明 第一种是单按钮弹窗。 它适合“结果已经发生,只需要用户知道”的场景。按钮文案写成“

ArkUI AlertDialog:确认弹窗别一上来就吓人

今天我们用 AlertDialog 做三种确认场景:单按钮说明、双按钮选择、危险操作确认。

AlertDialog 会打断用户当前动作,所以我们别把它当成普通提示来用。只有用户需要做决定,或者必须看清楚后果时,它才值得出现。

单按钮说明

第一种是单按钮弹窗。

this.getUIContext().showAlertDialog({
  title: '草稿已经保存',
  message: '你可以稍后继续编辑,这一步只需要让用户知道结果。',
  autoCancel: true,
  confirm: {
    value: '知道了',
    action: () => {
      console.info('AlertDialog single confirm')
    }
  }
})

它适合“结果已经发生,只需要用户知道”的场景。按钮文案写成“知道了”比“确定”更像人在说话。

双按钮选择

第二种是双按钮弹窗。

this.getUIContext().showAlertDialog({
  title: '离开当前编辑?',
  message: '离开后未提交的内容不会发布,但已经保存的草稿还在。',
  primaryButton: {
    value: '继续编辑',
    action: () => {
      console.info('AlertDialog keep editing')
    }
  },
  secondaryButton: {
    value: '离开',
    fontColor: '#2563EB',
    action: () => {
      console.info('AlertDialog leave page')
    }
  }
})

这里的重点不是“有两个按钮”,而是两个按钮要表达两个明确选择。不要只写“取消”和“确定”,用户还得自己猜确定的是哪件事。

危险操作确认

第三种是危险操作确认。

this.getUIContext().showAlertDialog({
  title: '删除这条记录?',
  message: '删除后页面里不会再显示这条记录。这里不做真实删除,只演示危险操作确认。',
  primaryButton: {
    value: '取消',
    action: () => {
      console.info('AlertDialog cancel delete')
    }
  },
  secondaryButton: {
    value: '删除',
    fontColor: '#DC2626',
    action: () => {
      console.info('AlertDialog confirm delete')
    }
  }
})

危险动作要说清楚后果,但不要把一整套业务塞进弹窗。我们这篇只打印日志,保持案例干净。

你做过的项目里,哪个确认弹窗最容易让人误点?可以拿它和这里的按钮文案对比一下。

完整代码

@Entry
@Component
struct ArkUIAlertDialogDemo {
  private showSingleButtonDialog(): void {
    this.getUIContext().showAlertDialog({
      title: '草稿已经保存',
      message: '你可以稍后继续编辑,这一步只需要让用户知道结果。',
      autoCancel: true,
      confirm: {
        value: '知道了',
        action: () => {
          console.info('AlertDialog single confirm')
        }
      }
    })
  }

  private showTwoButtonDialog(): void {
    this.getUIContext().showAlertDialog({
      title: '离开当前编辑?',
      message: '离开后未提交的内容不会发布,但已经保存的草稿还在。',
      autoCancel: true,
      primaryButton: {
        value: '继续编辑',
        action: () => {
          console.info('AlertDialog keep editing')
        }
      },
      secondaryButton: {
        value: '离开',
        fontColor: '#2563EB',
        action: () => {
          console.info('AlertDialog leave page')
        }
      }
    })
  }

  private showDangerDialog(): void {
    this.getUIContext().showAlertDialog({
      title: '删除这条记录?',
      message: '删除后页面里不会再显示这条记录。这里不做真实删除,只演示危险操作确认。',
      autoCancel: true,
      primaryButton: {
        value: '取消',
        action: () => {
          console.info('AlertDialog cancel delete')
        }
      },
      secondaryButton: {
        value: '删除',
        fontColor: '#DC2626',
        action: () => {
          console.info('AlertDialog confirm delete')
        }
      }
    })
  }

  @Builder
  sectionTitle(title: string, desc: string) {
    Column({ space: 6 }) {
      Text(title)
        .fontSize(19)
        .fontWeight(FontWeight.Bold)
        .fontColor('#111827')
      Text(desc)
        .fontSize(13)
        .fontColor('#6B7280')
        .lineHeight(20)
    }
    .width('100%')
    .alignItems(HorizontalAlign.Start)
  }

  @Builder
  dialogCard(title: string, desc: string) {
    Column({ space: 6 }) {
      Column({ space: 6 }) {
        Text(title)
          .fontSize(17)
          .fontWeight(FontWeight.Bold)
          .fontColor('#111827')
        Text(desc)
          .fontSize(13)
          .fontColor('#6B7280')
          .lineHeight(20)
      }
      .width('100%')
      .alignItems(HorizontalAlign.Start)
    }
    .width('100%')
    .padding(16)
    .borderRadius(14)
    .backgroundColor('#FFFFFF')
    .border({ width: 1, color: '#E5E7EB' })
    .alignItems(HorizontalAlign.Start)
  }

  build() {
    Scroll() {
      Column({ space: 22 }) {
        Column({ space: 8 }) {
          Text('ArkUI AlertDialog')
            .fontSize(28)
            .fontWeight(FontWeight.Bold)
            .fontColor('#111827')
          Text('确认弹窗别一上来就吓人')
            .fontSize(16)
            .fontColor('#4B5563')
          Text('AlertDialog 会打断当前操作,所以我们只在需要用户确认时使用。单纯提醒结果时,轻提示通常更合适。')
            .fontSize(14)
            .fontColor('#6B7280')
            .lineHeight(22)
        }
        .width('100%')
        .alignItems(HorizontalAlign.Start)

        this.sectionTitle('单按钮:只需要用户知道', '单按钮适合“结果已经发生”的说明,不需要再让用户选择。')
        this.dialogCard('保存结果', '标题说结论,正文补一句原因,按钮只保留一个清晰动作。')
        Button('打开单按钮弹窗')
          .fontSize(14)
          .fontColor('#FFFFFF')
          .backgroundColor('#2563EB')
          .borderRadius(18)
          .height(38)
          .padding({ left: 18, right: 18 })
          .onClick(() => this.showSingleButtonDialog())

        this.sectionTitle('双按钮:让用户做决定', '离开、放弃、覆盖这类动作更适合双按钮确认。按钮文案要写具体。')
        this.dialogCard('离开确认', '一个按钮保留当前操作,另一个按钮继续离开。')
        Button('打开双按钮弹窗')
          .fontSize(14)
          .fontColor('#FFFFFF')
          .backgroundColor('#0F766E')
          .borderRadius(18)
          .height(38)
          .padding({ left: 18, right: 18 })
          .onClick(() => this.showTwoButtonDialog())

        this.sectionTitle('危险操作:把后果说清楚', '删除、清空、重置这类操作要让用户看到后果,但不要把业务流程塞进弹窗。')
        this.dialogCard('删除确认', '示例只打印日志,不做真实数据处理。')
        Button('打开危险确认')
          .fontSize(14)
          .fontColor('#FFFFFF')
          .backgroundColor('#DC2626')
          .borderRadius(18)
          .height(38)
          .padding({ left: 18, right: 18 })
          .onClick(() => this.showDangerDialog())
      }
      .width('100%')
      .padding(24)
      .alignItems(HorizontalAlign.Start)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F8FAFC')
  }
}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。