331 lines
8.6 KiB
Markdown
331 lines
8.6 KiB
Markdown
# ConfirmDialog 组件
|
||
|
||
## 组件说明
|
||
|
||
确认对话框组件,基于 Ant Design Modal 封装,提供统一的确认对话框样式和交互。支持单个删除、批量删除、警告确认和通用确认等多种场景。
|
||
|
||
## 组件位置
|
||
|
||
```
|
||
src/components/ConfirmDialog/ConfirmDialog.jsx
|
||
```
|
||
|
||
## API 方法
|
||
|
||
组件以静态方法的形式提供,无需实例化,直接调用即可。
|
||
|
||
### ConfirmDialog.delete()
|
||
|
||
显示单个项目删除确认对话框。
|
||
|
||
#### 参数
|
||
|
||
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
||
|--------|------|------|--------|------|
|
||
| title | string | 否 | '确认删除' | 对话框标题 |
|
||
| itemName | string | 是 | - | 要删除的项目名称 |
|
||
| itemInfo | string | 否 | - | 项目附加信息 |
|
||
| onOk | function | 否 | - | 确认回调,支持返回 Promise |
|
||
| onCancel | function | 否 | - | 取消回调 |
|
||
|
||
#### 使用示例
|
||
|
||
```jsx
|
||
import ConfirmDialog from '../components/ConfirmDialog/ConfirmDialog'
|
||
|
||
const handleDeleteUser = (record) => {
|
||
ConfirmDialog.delete({
|
||
itemName: `用户名:${record.userName}`,
|
||
itemInfo: `姓名:${record.name}`,
|
||
onOk() {
|
||
return new Promise((resolve) => {
|
||
setTimeout(() => {
|
||
// 执行删除操作
|
||
deleteUser(record.id)
|
||
resolve()
|
||
Toast.success('删除成功', `用户 "${record.userName}" 已成功删除`)
|
||
}, 1000)
|
||
})
|
||
},
|
||
})
|
||
}
|
||
```
|
||
|
||
### ConfirmDialog.batchDelete()
|
||
|
||
显示批量删除确认对话框。
|
||
|
||
#### 参数
|
||
|
||
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
||
|--------|------|------|--------|------|
|
||
| count | number | 是 | - | 要删除的项目数量 |
|
||
| items | Array<ItemInfo> | 是 | - | 项目列表 |
|
||
| onOk | function | 否 | - | 确认回调,支持返回 Promise |
|
||
| onCancel | function | 否 | - | 取消回调 |
|
||
|
||
##### ItemInfo 对象
|
||
|
||
| 属性名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| name | string | 是 | 项目名称 |
|
||
| info | string | 否 | 项目附加信息 |
|
||
|
||
#### 使用示例
|
||
|
||
```jsx
|
||
const handleBatchDelete = () => {
|
||
const selectedUsers = filteredUsers.filter((u) => selectedRowKeys.includes(u.id))
|
||
const items = selectedUsers.map((user) => ({
|
||
name: user.userName,
|
||
info: user.name,
|
||
}))
|
||
|
||
ConfirmDialog.batchDelete({
|
||
count: selectedRowKeys.length,
|
||
items,
|
||
onOk() {
|
||
return new Promise((resolve) => {
|
||
setTimeout(() => {
|
||
const count = selectedRowKeys.length
|
||
const newUsers = filteredUsers.filter((u) => !selectedRowKeys.includes(u.id))
|
||
setFilteredUsers(newUsers)
|
||
setSelectedRowKeys([])
|
||
resolve()
|
||
Toast.success('批量删除成功', `已成功删除 ${count} 个用户`)
|
||
}, 1000)
|
||
})
|
||
},
|
||
})
|
||
}
|
||
```
|
||
|
||
### ConfirmDialog.warning()
|
||
|
||
显示警告确认对话框。
|
||
|
||
#### 参数
|
||
|
||
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
||
|--------|------|------|--------|------|
|
||
| title | string | 是 | - | 对话框标题 |
|
||
| content | string\|ReactNode | 是 | - | 对话框内容 |
|
||
| okText | string | 否 | '确定' | 确认按钮文字 |
|
||
| cancelText | string | 否 | '取消' | 取消按钮文字 |
|
||
| onOk | function | 否 | - | 确认回调 |
|
||
| onCancel | function | 否 | - | 取消回调 |
|
||
|
||
#### 使用示例
|
||
|
||
```jsx
|
||
const handleRiskyOperation = () => {
|
||
ConfirmDialog.warning({
|
||
title: '操作警告',
|
||
content: '此操作可能影响系统稳定性,确定要继续吗?',
|
||
okText: '继续操作',
|
||
onOk() {
|
||
// 执行危险操作
|
||
performRiskyOperation()
|
||
},
|
||
})
|
||
}
|
||
```
|
||
|
||
### ConfirmDialog.confirm()
|
||
|
||
显示通用确认对话框。
|
||
|
||
#### 参数
|
||
|
||
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
||
|--------|------|------|--------|------|
|
||
| title | string | 是 | - | 对话框标题 |
|
||
| content | string\|ReactNode | 是 | - | 对话框内容 |
|
||
| okText | string | 否 | '确定' | 确认按钮文字 |
|
||
| cancelText | string | 否 | '取消' | 取消按钮文字 |
|
||
| okType | string | 否 | 'primary' | 确认按钮类型(primary/danger) |
|
||
| onOk | function | 否 | - | 确认回调 |
|
||
| onCancel | function | 否 | - | 取消回调 |
|
||
|
||
#### 使用示例
|
||
|
||
```jsx
|
||
const handleSubmit = () => {
|
||
ConfirmDialog.confirm({
|
||
title: '提交确认',
|
||
content: '确定要提交当前表单吗?',
|
||
okText: '提交',
|
||
onOk() {
|
||
// 执行提交操作
|
||
submitForm()
|
||
},
|
||
})
|
||
}
|
||
```
|
||
|
||
## 完整使用示例
|
||
|
||
### 单个删除
|
||
|
||
```jsx
|
||
import ConfirmDialog from '../components/ConfirmDialog/ConfirmDialog'
|
||
import Toast from '../components/Toast/Toast'
|
||
|
||
function UserListPage() {
|
||
const handleDeleteUser = (record) => {
|
||
ConfirmDialog.delete({
|
||
itemName: `用户名:${record.userName}`,
|
||
itemInfo: `姓名:${record.name}`,
|
||
onOk() {
|
||
return new Promise((resolve) => {
|
||
setTimeout(() => {
|
||
const newUsers = filteredUsers.filter((u) => u.id !== record.id)
|
||
setFilteredUsers(newUsers)
|
||
resolve()
|
||
Toast.success('删除成功', `用户 "${record.userName}" 已成功删除`)
|
||
}, 1000)
|
||
})
|
||
},
|
||
})
|
||
}
|
||
|
||
return (
|
||
<Button onClick={() => handleDeleteUser(user)} danger>
|
||
删除
|
||
</Button>
|
||
)
|
||
}
|
||
```
|
||
|
||
### 批量删除
|
||
|
||
```jsx
|
||
function UserListPage() {
|
||
const [selectedRowKeys, setSelectedRowKeys] = useState([])
|
||
|
||
const handleBatchDelete = () => {
|
||
const selectedUsers = filteredUsers.filter((u) => selectedRowKeys.includes(u.id))
|
||
const items = selectedUsers.map((user) => ({
|
||
name: user.userName,
|
||
info: user.name,
|
||
}))
|
||
|
||
ConfirmDialog.batchDelete({
|
||
count: selectedRowKeys.length,
|
||
items,
|
||
onOk() {
|
||
return new Promise((resolve) => {
|
||
setTimeout(() => {
|
||
const count = selectedRowKeys.length
|
||
const newUsers = filteredUsers.filter((u) => !selectedRowKeys.includes(u.id))
|
||
setFilteredUsers(newUsers)
|
||
setSelectedRowKeys([])
|
||
resolve()
|
||
Toast.success('批量删除成功', `已成功删除 ${count} 个用户`)
|
||
}, 1000)
|
||
})
|
||
},
|
||
})
|
||
}
|
||
|
||
return (
|
||
<Button
|
||
onClick={handleBatchDelete}
|
||
disabled={selectedRowKeys.length === 0}
|
||
danger
|
||
>
|
||
批量删除
|
||
</Button>
|
||
)
|
||
}
|
||
```
|
||
|
||
### 自定义内容
|
||
|
||
```jsx
|
||
ConfirmDialog.confirm({
|
||
title: '重置密码',
|
||
content: (
|
||
<div>
|
||
<p>确定要重置用户 <strong>{user.userName}</strong> 的密码吗?</p>
|
||
<p style={{ color: '#faad14' }}>新密码将发送到用户邮箱</p>
|
||
</div>
|
||
),
|
||
okText: '确认重置',
|
||
okType: 'primary',
|
||
onOk() {
|
||
resetPassword(user.id)
|
||
},
|
||
})
|
||
```
|
||
|
||
### 异步操作处理
|
||
|
||
```jsx
|
||
const handleDeleteUser = (record) => {
|
||
ConfirmDialog.delete({
|
||
itemName: `用户名:${record.userName}`,
|
||
itemInfo: `姓名:${record.name}`,
|
||
async onOk() {
|
||
try {
|
||
// 调用 API 删除用户
|
||
await api.deleteUser(record.id)
|
||
|
||
// 更新本地数据
|
||
const newUsers = filteredUsers.filter((u) => u.id !== record.id)
|
||
setFilteredUsers(newUsers)
|
||
|
||
Toast.success('删除成功', `用户 "${record.userName}" 已成功删除`)
|
||
} catch (error) {
|
||
Toast.error('删除失败', error.message)
|
||
throw error // 阻止对话框关闭
|
||
}
|
||
},
|
||
})
|
||
}
|
||
```
|
||
|
||
## 特性说明
|
||
|
||
### 删除确认样式
|
||
|
||
- 红色危险图标
|
||
- 高亮显示要删除的项目信息
|
||
- 红色警告提示"此操作不可恢复,请谨慎操作!"
|
||
- 危险样式的确认按钮
|
||
|
||
### 批量删除列表
|
||
|
||
- 最多显示 200px 高度的滚动列表
|
||
- 每个项目显示名称和附加信息
|
||
- 项目间用分隔线隔开
|
||
|
||
### Promise 支持
|
||
|
||
- `onOk` 回调支持返回 Promise
|
||
- 异步操作进行时,确认按钮显示 loading 状态
|
||
- Promise reject 时,对话框不会关闭
|
||
- 适合调用 API 等异步操作
|
||
|
||
### 居中显示
|
||
|
||
- 所有对话框默认垂直居中显示(`centered: true`)
|
||
|
||
## 使用场景
|
||
|
||
1. **删除确认** - 删除用户、设备、订单等数据前的确认
|
||
2. **批量删除** - 批量删除多条数据前的确认
|
||
3. **危险操作警告** - 执行可能影响系统的操作前的警告
|
||
4. **通用确认** - 提交表单、保存设置等操作的确认
|
||
5. **重要操作二次确认** - 任何需要用户明确确认的操作
|
||
|
||
## 注意事项
|
||
|
||
1. 删除操作统一使用红色危险样式,提醒用户谨慎操作
|
||
2. `onOk` 回调支持同步和异步(返回 Promise)两种方式
|
||
3. 批量删除时,`items` 数组会在对话框中完整展示,注意数量控制
|
||
4. 对话框内容支持字符串和 React 节点,可以自定义复杂内容
|
||
5. 确认按钮文字建议明确操作类型,如"确认删除"、"确认提交"等
|
||
6. 配合 Toast 组件使用,提供操作结果反馈
|
||
7. 异步操作失败时,throw error 可以阻止对话框关闭
|