Skip to content

Dialog 对话框 ​

声明式模态对话框。@Binding var visible 控制显隐,遮罩 + 居中面板,按钮复用 LhButton。

契约源:lh-ui-core/specs/dialog.json · 黄金用例:lh-ui-core/cases/dialog.json(8 条,已翻译为 XCTest,macOS 宿主即可运行)

类型 ​

六种类型决定确认按钮的语义色(buttonType(for:) 映射到 LhButtonType)。

9:41Dialog 类型
删除确认
此操作将永久删除该项,是否继续?

HTML 模拟预览(iOS / SwiftUI 外观),非真机渲染

swift
@State private var visible = false

LhDialog(
  visible: $visible,
  title: "删除确认",
  content: "此操作将永久删除该项,是否继续?",
  type: .danger,
  confirmText: "确认",
  cancelText: "取消"
)

显隐与回调 ​

  • visible = true 渲染遮罩与面板;visible = false 不发射任何绘制指令(黄金用例 hidden-not-rendered)。
  • 点击「确认」依次触发 onConfirm 与 onClose(confirm-also-emits-onclose)。
  • 点击「取消」触发 onCancel;onClose 由组件内部负责把 visible 置回 false(包在 withAnimation 内)。
  • closable = true 时点击遮罩也会触发 onClose(closable-overlay-emits-onclose);默认不关闭(not-closable-blocks-overlay-close)。
9:41Dialog 遮罩可关闭
提示
点击遮罩即可关闭

HTML 模拟预览(iOS / SwiftUI 外观),非真机渲染

API ​

Props ​

属性说明类型默认值
visible是否显示(受控双向绑定)Bool—
title标题String""
content正文内容String""
type对话框类型,决定确认按钮语义色LhDialogType.default
confirmText确认按钮文字String"确认"
cancelText取消按钮文字String"取消"
closable点击遮罩是否可关闭Boolfalse
onConfirm确认回调(() -> Void)?nil
onCancel取消回调(() -> Void)?nil
onClose关闭回调(遮罩点击 / 按钮·取消 / 按钮·确认 都会触发)(() -> Void)?nil

LhDialogType ​

值确认按钮类型底色
.default.defaultcolor.background.default + 描边
.primary.primarycolor.primary.default
.success.successcolor.success.default
.warning.warningcolor.warning.default
.danger.dangercolor.danger.default
.info.infocolor.info.default

令牌对照 ​

令牌用途
dialog.width面板宽度(320pt)
dialog.paddingHorizontal / dialog.paddingVertical面板内边距
dialog.borderRadius面板圆角
dialog.titleFontSize / dialog.contentFontSize标题与正文字号
dialog.gap各区块纵向间距
color.background.overlay遮罩色
color.background.default面板底色
color.text.{primary,regular}标题与正文颜色
shadow.base面板阴影(LhShadow 载体)
zIndex.{modalBackdrop,modal}遮罩与面板的层级

黄金用例对照 ​

case id断言本地测试
confirm-emits-onconfirm确认触发 onConfirmtestConfirmUsesTypeColor
cancel-emits-oncancel取消触发 onCanceltestCancelUsesNeutralColor
confirm-also-emits-onclose确认同时触发 onClosetestConfirmUsesTypeColor
closable-overlay-emits-onclose遮罩点击触发 onClosetestClosableFlagIsExposed
not-closable-blocks-overlay-close默认遮罩不关闭testNotClosableBlocksOverlay
hidden-not-rendered隐藏时不渲染testHiddenNotRendered
title-renders-text标题正确渲染testTitleUsesTitleTokens
danger-type-uses-danger-token危险类型消费危险色令牌testDangerTypeUsesDangerToken

另有专项:testVisibleRendersAppearance / testLayoutUsesDialogTokens / testDarkColorsComeFromDarkTokens / testDimensionsAreIdenticalInDarkMode / testDialogViewInitAcceptsConstant。

bash
swift test --filter LhDialogTests    # macOS 宿主即可跑,无需模拟器