Popconfirm
就近确认轻量危险操作。中文惯用名:气泡确认。
稳定本期新增已接入
元信息
| 字段 | 值 |
|---|---|
| 规范 ID | component.popconfirm |
| 名称 | Popconfirm |
| 二级分类 | 反馈(feedback) |
| 用途 | 就近确认轻量危险操作 |
| 描述 | 中文惯用名:气泡确认。 |
预览
静态结构:基于 vendored Popover——children(触发元素)经 PopoverTrigger 包裹(外层套 trigger 包装节点),点击后在触发元素旁弹出 PopoverContent 卡片:标题区(data-slot="popconfirm-title",font-medium)+ 说明区(data-slot="popconfirm-description",text-sm text-muted-foreground)+ 右对齐按钮组(outline 取消 + default 确定,danger 时确定按钮为 destructive)。确认或取消后浮层自动关闭并触发对应事件。
DSL 结构
{
"type": "Popconfirm",
"props": {
"title": "删除该条记录?",
"description": "删除后不可恢复。",
"danger": true
},
"children": [
{
"type": "Button",
"props": {
"text": "删除",
"danger": true
}
}
],
"events": {
"onConfirm": {
"action": "setState",
"params": {
"deleted": true
}
}
}
}何时用
何时使用
- 就近确认轻量危险操作:删除一行、移除标签等,在触发元素旁弹出,二次确认后立即执行。
- 确认成本低、信息少的场景:标题说清后果,用户一眼可判。
- 列表操作列、卡片角落动作等触发点明确的场景。
何时不用
- 需要填写信息、展示详细后果说明或多步决策的确认:使用 Dialog(阻断式对话框)。
- 纯信息展示、无需确认:使用 Popover 或 Tooltip。
- 批量 / 不可逆且影响面大的操作:使用 Dialog 并明确列出影响范围,Popconfirm 承载不下。
变体
| 变体 | 视觉形态 | 适用场景 |
|---|---|---|
| 默认确认 | 标题(+ 说明)+ 取消 / 确定按钮 | 一般性二次确认(如「放弃当前编辑?」) |
| danger 危险确认 | 确定按钮为 destructive 危险色 | 删除、清空等破坏性操作的二次确认 |
| 仅标题 | 省略 description,仅一行标题 + 按钮组 | 后果不言自明的轻量确认 |
| 标题 + 说明 | 标题下附辅助说明文案 | 需要补充后果说明(如「删除后不可恢复」) |
API 属性
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
title | string | — | 确认框标题 |
description | string | — | 辅助说明文案 |
confirmText | string | — | 确认按钮文案;缺省取 i18n pactor.alertDialog.confirm(zh-CN「确定」) |
cancelText | string | — | 取消按钮文案;缺省取 i18n pactor.alertDialog.cancel(zh-CN「取消」) |
danger | boolean | false | 确认按钮使用危险色(destructive) |
onConfirm | () => void | — | 确认事件:点击确认按钮触发,且浮层自动关闭 |
onCancel | () => void | — | 取消事件:点击取消按钮触发,且浮层自动关闭 |
children | ReactNode | — | 触发元素(DSL 子树,经 Renderer children 机制渲染) |
className | string | — | 通用:浮层内容根节点 class(与内置样式合并) |
style | CSSProperties | — | 通用:内联样式(同 className 挂载规则) |
使用规范
- 确认 / 取消点击后浮层均自动关闭,事件在关闭后触发——不要在 onConfirm 里手动管理浮层开关。
- 危险操作必须 danger=true 让确认按钮呈危险色,标题写清后果(「删除后不可恢复」)。
- 确认文案尽量用动词(「删除」「移出」)代替默认「确定」,让用户不看标题也能预判后果。
- 触发元素用 children 渲染(通常为 Button / 文字链),Popconfirm 自身不提供触发样式。
- 与 Dialog 的边界:只需「是 / 否」二选一、信息一两行说清用 Popconfirm;需要表单、长说明或强阻断用 Dialog。
正例
- ✓ 列表行内 text「删除」按钮外包 Popconfirm:title「确定删除该条目?」、description「删除后不可恢复」、danger、confirmText「删除」。
- ✓ 编辑器离开页面前:title「放弃未保存的修改?」,确认后丢弃草稿并跳转。
- ✓ 取消订阅场景:confirmText「取消订阅」、cancelText「再想想」,文案即操作本身。
反例
- ✕ 用 Popconfirm 承载包含表单或多段说明的复杂确认(应使用 Dialog)。
- ✕ 危险操作不设 danger,确认按钮与普通确认无异,用户低估后果。
- ✕ 把 Popconfirm 当 Popover 用,展示纯信息内容而无确认诉求。
Design Token 映射
不适用:组件 tokenRefs 为空:样式 Token 数据尚未接入,三层映射(Primitive → Semantic → Component)待样式 Token 接入后回填。