Alert 警告提示
import { Alert } from '@apollo-design/ui';在页面中展示需要关注的信息;支持完整 Vue 内容插槽和原生关闭按钮。全部15个实际示例见 demo/。
Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| type | 提示类型 | 'success' | 'info' | 'warning' | 'error' |
banner 时 warning,否则 info |
| variant | 显式值优先于当前 components.alert.variant |
'outlined' | 'filled' |
outlined |
| title | 标题文本;富内容走 #title | string |
— |
| message | 废弃标题别名,title 未传时使用 | string |
— |
| description | 描述文本;富内容走 #description | string |
— |
| showIcon | 是否显示图标;显式 false 抑制 banner 默认图标 | boolean |
banner 时 true,否则 false |
| banner | 顶部通告形态 | boolean |
false |
| closable | boolean 或关闭配置;对象恒可关,当前 Provider 可给默认值 | boolean | AlertClosable |
false |
| closeIcon | 遗留标量图标,推荐 #closeIcon 或 closable.closeIcon | string | number | boolean | null |
— |
| closeText | 废弃关闭文案,推荐 #closeIcon | string |
— |
| afterClose | 遗留完成回调,推荐 @after-close | () => void |
— |
| prefixCls | DOM 类名前缀;自定义前缀需预载对应静态 CSS | string |
apollo-alert |
| id / role | 实际根 div 的属性 | string |
role=alert |
| classNames / styles | root/icon/section/title/description/actions/close;对象或读取当前合并 props 的函数 | AlertSemanticValue<…> |
— |
class、style、tabindex、ARIA/data、普通原生监听器和 once 等修饰符落在实际根 div;nativeElement 指向该节点。title 已是内容 prop,不另作同名原生提示属性。原生根事件使用 DOM Event;onClick/onMouseenter/onMouseleave 为对应监听器写法。
语义函数的 props 包括当前解析后的 type、variant、prefixCls、role、图标显示和关闭开关;role 默认 alert,显式值优先。
Provider 四类图标的 null/undefined 沿用默认图标回退,默认图标按装饰内容处理;自定义图标语义由内容负责。
Slots
| 插槽 | 说明 |
|---|---|
| #title | 完整标题内容,存在则覆盖 title/message,包括有意为空。 |
| #description | 完整描述;空内容不回退,且不保留 with-description 布局。 |
| #icon | 完整类型图标内容;空槽抑制默认图标,showIcon=false 仍优先。 |
| #action | 完整操作内容,支持多个原生操作节点。 |
| #closeIcon | 关闭按钮内的文本/图标;存在则覆盖所有图标配置,空槽不回退。 |
五个槽均在当前 render 读取,支持条件添加/移除、Fragment 与0。没有 default→title 的隐式通道。关闭内容优先级为 #closeIcon、closable.closeIcon、closeText、遗留 closeIcon、Provider对象图标、Provider closeIcon、默认图标;配置值按是否提供判定,0/false/null/空串不被默认图标覆盖。
Events 与关闭状态
| 事件 | 载荷与时机 |
|---|---|
| close | 实际关闭按钮 click 的 MouseEvent,包含原生 Enter/Space 激活;每实例接受一次关闭请求。 |
| after-close | 内部关闭完成并移除后通知一次;禁动效和减少动画也完成。 |
onClose/onAfterClose 是事件监听器的程序化写法。closable.onClose/afterClose 保留业务配置能力,不能抑制 Vue 事件;同一函数同时作为配置与监听器时不重复调用。配置 afterClose 优先于遗留 plain afterClose。关闭按钮默认可访问名称为 Close,可用 closable 的 aria-label/aria-labelledby 定义业务名称;其 aria/data 落在关闭按钮,根 ARIA 仍属根。
关闭是内部一次性状态,没有 open/visible/v-model 或取消钩子。父级通过 v-if/key 控制挂载和重新显示;更改 closable 不重新打开已关闭实例。父级在 @close 中直接卸载时,不会冒充内部关闭完成事件。保留遗留 closeText 真值触发可关闭的既有优先级;显式 closable boolean 决定通常关闭开关。
Ref
AlertRef.nativeElement: HTMLDivElement | null,关闭完成或卸载后为 null。
ErrorBoundary
Alert.ErrorBoundary 与 AlertErrorBoundary 为同一有类型的组件。完整默认 slot 是健康内容,不额外包装 DOM;无 v-model、reset 方法或公开 expose。通过父级 key 重挂可恢复。
| 参数 | 说明 | 类型 |
|---|---|---|
| title / message | 错误标题数据,缺省使用 String(error);message 为旧别名 | VNodeChild |
| description | 错误描述数据,缺省以 pre 展示 Vue 错误阶段信息 | VNodeChild |
| id | 错误回退 Alert 的 id | string |
Vue onErrorCaptured 捕获实际后代的 setup/渲染/生命周期及所属事件错误并阻断上抛,包括抛出0/false/null/undefined。边界自身或脱离 Vue 调用链的错误不属于此边界。class/style/ARIA/native attrs 的原生落点是错误回退 Alert,健康 Fragment 不分配这些 attrs 到任意业务子节点。
默认错误详情为名为 Error details 的可聚焦 region;窄视口下支持原生键盘横向滚动。提供自定义 description 数据时,其交互与语义由该内容负责。
Theme
| Token | 作用 | 默认来源 |
|---|---|---|
| borderRadius | 圆角 | borderRadiusLG |
| withDescriptionIconSize | 带描述图标尺寸 | fontSizeHeading3 |
| defaultPadding | 普通内边距 | paddingContentVerticalSM + 横向12px |
| withDescriptionPadding | 描述内边距 | paddingMD / paddingContentHorizontalLG |
最近 theme.components.Alert 的四字段与当前 Alias 实时消费,移除覆盖恢复当前主题。原生根 --apollo-alert-* 变量优先,默认/暗色/紧凑/组合保持作用域;关闭遵循 theme.token.motion 和 prefers-reduced-motion。
显式空 ThemeProvider 仍是最近的主题来源,恢复默认 Alias 和四个 Token;其下未配置主题的 ConfigProvider 延续该来源。没有主题来源的 ConfigProvider 不写组件主题变量,页面 CSS 的暗色/紧凑作用域继续生效。
迁移与验证范围见 docs/migrations/alert-contracts.md、docs/audit/2026-10-29-alert-contract-audit.md。
代码演示
基本 #
最简单的用法,适用于简短的警告提示。
四种样式 #
共有四种样式 success、info、warning、error。
可关闭的警告提示 #
显示关闭按钮,点击可关闭警告提示。@close 接收真实的原生 MouseEvent;关闭完成使用 @after-close。
可关闭的警告提示 #
可口的图标让信息类型更加醒目。
自定义图标 #
可口的图标让信息类型更加醒目。
自定义操作项 #
可以在右上角自定义操作项。
填充态 #
通过 variant="filled" 隐藏边框。
平滑地卸载 #
@close 通知原生关闭请求,@after-close 在内部关闭完成后通知父级。减少动画偏好或 theme.token.motion=false 时也会完成移除并发出一次完成事件。Alert 没有受控 open/visible 模型;通过父级 v-if 重新挂载可再次显示。
语义化的 DOM 结构样式 #
通过 classNames 和 styles 传入对象/函数可以自定义 Alert 的语义化结构样式。
标题对齐 #
未设置 description 时,Alert 会让图标、内容、操作区和关闭按钮作为整体垂直居中。
若标题可能换行并希望元素与标题首行对齐,可以通过语义化 styles 自行调整。
错误边界 #
以 Vue onErrorCaptured 捕获实际后代的渲染、setup、生命周期及所属事件错误;边界自身和脱离 Vue 调用链的错误不属于此边界。示例切换后代的渲染状态后抛错,以父级 key 重新挂载边界恢复内容,不新增 reset 方法。
内容插槽优先级 #
同名 slot 存在时优先于内容 prop,明确空内容不会回退。移除条件 slot 后恢复 prop。Alert 的 title/description 与 CollapsePanel 的 header 使用同一存在优先规则;面板标题视觉为空时保留 Toggle panel 的可访问名称,切换标题不会重建面板中的输入状态。
A present slot overrides its content prop, including intentionally empty content. Removing a conditional slot restores the prop. Alert title/description and CollapsePanel header follow the same presence rule; the visually empty panel header retains an accessible Toggle panel name, and header changes preserve panel input state.
组件 Token #
通过当前 theme.components.Alert 设置圆角、普通内边距、带描述内边距和描述图标尺寸。切换回默认值时移除覆盖,输入值与焦点随原生节点保留。根元素显式 --apollo-alert-* 变量仍优先于 Provider;默认与紧凑算法的内边距来自当前 Alias Token。
Use the current theme.components.Alert values for all four tokens. Removing the overrides restores the source theme without remounting the editor. Explicit root CSS variables take precedence over Provider tokens.