--- localeCode: zh-CN order: 66 category: 反馈类 title: Popconfirm 气泡确认框 icon: doc-popconfirm brief: 目标元素的操作需要用户进一步的确认时使用。与 Popover 相比它内置了一系列可配置的操作按钮,与 Modal 相比它不强制全屏居中显示,交互也更轻量 --- ## 代码演示 ### 如何引入 ```jsx import import { Popconfirm } from '@douyinfe/semi-ui'; ``` ### 基本使用 ```jsx live=true import React from 'react'; import { Popconfirm, Button, Toast } from '@douyinfe/semi-ui'; () => { const onConfirm = () => { Toast.success('确认保存!'); }; const onCancel = () => { Toast.warning('取消保存!'); }; return ( ); }; ``` ### 类型搭配 开发者可以基于场景使用 `okType`/`cancelType`/`icon` 等参数搭配出不同风格的气泡式确认框。 ```jsx live=true import React, { useState } from 'react'; import { Popconfirm, Radio, RadioGroup, Button } from '@douyinfe/semi-ui'; import { IconAlertTriangle } from '@douyinfe/semi-icons'; function TypesConfirmDemo(props = {}) { const typeMap = { default: { icon: , }, warning: { icon: , }, danger: { okType: 'danger', icon: , }, tertiary: { icon: , }, }; const keys = Object.keys(typeMap); const [type, setType] = useState('default'); const [visible, _setVisible] = useState(true); const changeType = e => { const type = e && e.target && e.target.value; if (type && keys.includes(type)) { setType(type); } }; const setVisible = visible => _setVisible(visible); const toggleVisible = () => setVisible(!visible); return (
{keys.map(key => ( {key} ))}
); } ``` ### 延时关闭 onOk、onCancel 可以通过 return Promise 实现点击后延时关闭 (v2.19后支持)。 onCancel、onOk 被触发时,对应的 Button 会自动切换为 loading: true promise solve 会关闭气泡确认框, promise reject时气泡依然保留,同时 button loading 自动切换为 false ```jsx live=true import React from 'react'; import { Popconfirm, Button, Toast } from '@douyinfe/semi-ui'; () => { const onConfirm = () => { return new Promise((resolve, reject) => { setTimeout(() => { console.log('resolve, close popconfirm'); resolve(); }, 2000); }); }; const onCancel = () => { return new Promise((resolve, reject) => { setTimeout(() => { console.log('reject, popconfirm still exist'); reject(); }, 2000); }); }; return ( ); }; ``` ### 搭配 Tooltip 或 Popover 使用 请参考[搭配使用](/zh-CN/show/tooltip#%E6%90%AD%E9%85%8D-popover-%E6%88%96-popconfirm-%E4%BD%BF%E7%94%A8) ## API 参考 | 属性 | 说明 | 类型 | 默认值 | 版本 | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | ------------------- | ----------------- | | arrowPointAtCenter | “小三角”是否指向元素中心,需要同时传入"showArrow=true" | boolean | false | **0.34.0** | | cancelText | 取消按钮文字 | string | "取消" | | cancelButtonProps | 取消按钮的 props | object | | **0.29.0** | | cancelType | 取消按钮类型 | string | "tertiary" | | content | 显示的内容 | string\|ReactNode | | | defaultVisible | 气泡框默认是否展示 | boolean | | **0.19.0** | | disabled | 点击 Popconfirm 子元素是否弹出气泡确认框 | boolean | false | | getPopupContainer | 指定父级 DOM,弹层将会渲染至该 DOM 中,自定义时容器需要设置 `position: relative` | Function():HTMLElement | () => document.body | | icon | 自定义弹出气泡 Icon 图标 | ReactNode | | | motion | 下拉列表出现/隐藏时,是否有动画 | boolean\|object | true | | okText | 确认按钮文字 | string | "确认" | | okType | 确认按钮类型 | string | "primary" | | okButtonProps | 确认按钮的 props | object | | **0.29.0** | | position | 方向,可选值:`top`,`topLeft`,`topRight`,`left`,`leftTop`,`leftBottom`,
`right`,`rightTop`,`rightBottom`,`bottom`,`bottomLeft`,`bottomRight` | string | "bottomLeft" | | showArrow | 是否显示箭头三角形 | boolean | false | | | stopPropagation | 是否阻止弹层上的点击事件冒泡 | boolean | true | **0.34.0** | | title | 显示的标题 | string\|ReactNode | | | trigger | 触发展示的时机,可选值:hover / focus / click / custom | string | 'click' | | visible | 气泡框是否展示的受控属性 | boolean | | **0.19.0** | | zIndex | 浮层 z-index 值 | number | 1030 | | onConfirm | 点击确认按钮回调, Promise类型于 v 2.19后支持 | Function(e): void \| Promise | | | onCancel | 点击取消按钮回调,Promise类型于 v 2.19后支持 | Function(e): void \| Promise | | | onClickOutSide | 当弹出层处于展示状态,点击非Children、非浮层内部区域时的回调 | Function(e) | **2.1.0** | | onVisibleChange | 气泡框切换显示隐藏的回调 | Function(visible: boolean): void | () => {} | **0.19.0** | ## 设计变量 ## FAQ - **为什么 Popconfirm 浮层在靠近屏幕边界宽度不够时,丢失宽度意外换行?** 在 chromium 104 后 对于屏幕边界文本宽度不够时的换行渲染策略发生变化,详细原因可查看 [issue #1022](https://github.com/DouyinFE/semi-design/issues/1022),semi侧已经在v2.17.0版本修复了这个问题。