mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-09-26 14:23:48 +00:00
442 lines
9.2 KiB
Markdown
442 lines
9.2 KiB
Markdown
---
|
||
title: 全局反馈组件
|
||
iframe: true
|
||
iframeFormatter: subPages/feedback/index
|
||
---
|
||
|
||
# 全局反馈组件
|
||
|
||
本项目基于 Pinia 和 Wot UI 封装了三类可全局调用的反馈能力:GlobalLoading、GlobalToast、GlobalDialog。它们适合在网络请求中间件、路由导航守卫以及其他不方便直接依赖页面内 hook 实例的场景中使用。
|
||
|
||
:::tip 提示
|
||
Wot UI 原生提供了 useToast、useDialog 等函数式能力,但调用侧通常仍要依赖对应组件实例。这里的全局反馈组件通过 Pinia 保存状态,并在组件内部监听状态后再调用 wd-toast 或 wd-dialog,因此可以把触发逻辑放到更靠近业务流程的位置,例如请求拦截器和路由守卫。
|
||
:::
|
||
|
||
## 使用前提
|
||
|
||
使用这套全局反馈封装前,需要保证页面树中已经挂载以下组件实例:
|
||
|
||
- GlobalLoading
|
||
- GlobalToast
|
||
- GlobalDialog
|
||
|
||
本项目通过组件自动导入支持直接使用这些组件;业务侧只需要调用对应的 composable:
|
||
|
||
```vue
|
||
<template>
|
||
<GlobalLoading />
|
||
<GlobalToast />
|
||
<GlobalDialog />
|
||
<slot />
|
||
</template>
|
||
```
|
||
|
||
三个组件都会记录触发时所在页面路径,并且仅在相同页面内展示,避免切页后在错误页面继续显示旧反馈。
|
||
|
||
## 全局加载
|
||
|
||
### 概述
|
||
|
||
GlobalLoading 基于 Wot UI 的 wd-toast 封装,适合配合 axios、alova 等请求流程显示全局加载状态。
|
||
|
||
### 组件特性
|
||
|
||
- 基于 wd-toast 实现
|
||
- 默认不自动关闭
|
||
- 默认显示遮罩,防止重复操作
|
||
- 自动记录当前页面路径,只在触发页面展示
|
||
|
||
### 使用
|
||
|
||
```ts
|
||
import { useGlobalLoading } from '@/composables/useGlobalLoading'
|
||
|
||
const loading = useGlobalLoading()
|
||
```
|
||
|
||
### API
|
||
|
||
#### loading(option)
|
||
|
||
显示加载状态。
|
||
|
||
```ts
|
||
loading.loading('加载中...')
|
||
|
||
loading.loading({
|
||
msg: '数据加载中',
|
||
cover: true,
|
||
})
|
||
```
|
||
|
||
默认会合并以下配置:
|
||
|
||
- iconName: loading
|
||
- duration: 0
|
||
- cover: true
|
||
- position: middle
|
||
- show: true
|
||
|
||
#### close()
|
||
|
||
关闭加载状态。
|
||
|
||
```ts
|
||
loading.close()
|
||
```
|
||
|
||
### 参数说明
|
||
|
||
#### ToastOptions
|
||
|
||
| 参数 | 类型 | 默认值 | 说明 |
|
||
|------|------|--------|------|
|
||
| msg | string | - | 加载文案 |
|
||
| iconName | string | loading | 图标名称 |
|
||
| duration | number | 0 | 持续时间,0 表示不自动关闭 |
|
||
| cover | boolean | true | 是否显示遮罩 |
|
||
| position | string | middle | 显示位置:top \| middle \| bottom |
|
||
| show | boolean | true | 是否显示,内部状态字段 |
|
||
|
||
#### 参数形式
|
||
|
||
支持两种调用方式:
|
||
|
||
1. 字符串:作为 msg 使用
|
||
2. 对象:传入完整 ToastOptions
|
||
|
||
### 示例
|
||
|
||
```ts
|
||
const { loading, close } = useGlobalLoading()
|
||
|
||
async function fetchData() {
|
||
try {
|
||
loading('正在加载数据...')
|
||
await api.getData()
|
||
}
|
||
finally {
|
||
close()
|
||
}
|
||
}
|
||
```
|
||
|
||
## 全局提示
|
||
|
||
### 概述
|
||
|
||
GlobalToast 基于 Wot UI 的 wd-toast 封装,提供统一的全局轻提示能力。
|
||
|
||
### 组件特性
|
||
|
||
- 基于 wd-toast 实现
|
||
- 支持 success、error、info、warning 四种快捷调用
|
||
- 支持自定义位置、时长、图标和遮罩
|
||
- 自动记录当前页面路径,只在触发页面展示
|
||
|
||
### 使用
|
||
|
||
```ts
|
||
import { useGlobalToast } from '@/composables/useGlobalToast'
|
||
|
||
const toast = useGlobalToast()
|
||
```
|
||
|
||
### API
|
||
|
||
#### show(option)
|
||
|
||
显示普通提示。
|
||
|
||
```ts
|
||
toast.show('这是一条提示信息')
|
||
|
||
toast.show({
|
||
msg: '自定义提示',
|
||
duration: 3000,
|
||
position: 'top',
|
||
})
|
||
```
|
||
|
||
默认配置:
|
||
|
||
- duration: 2000
|
||
- show: false
|
||
- 调用时自动补齐 show: true
|
||
- 未传 position 时默认使用 middle
|
||
|
||
#### success(option)
|
||
|
||
成功提示,默认附带 success 图标,duration 为 1500。
|
||
|
||
```ts
|
||
toast.success('操作成功')
|
||
```
|
||
|
||
#### error(option)
|
||
|
||
错误提示,默认附带 error 图标,direction 为 vertical。
|
||
|
||
```ts
|
||
toast.error('操作失败')
|
||
```
|
||
|
||
#### info(option)
|
||
|
||
信息提示,默认附带 info 图标。
|
||
|
||
```ts
|
||
toast.info('这是一条信息')
|
||
```
|
||
|
||
#### warning(option)
|
||
|
||
警告提示,默认附带 warning 图标。
|
||
|
||
```ts
|
||
toast.warning('警告信息')
|
||
```
|
||
|
||
#### close()
|
||
|
||
手动关闭当前提示。
|
||
|
||
```ts
|
||
toast.close()
|
||
```
|
||
|
||
### 参数说明
|
||
|
||
#### ToastOptions
|
||
|
||
| 参数 | 类型 | 默认值 | 说明 |
|
||
|------|------|--------|------|
|
||
| msg | string | - | 提示内容 |
|
||
| duration | number | 2000 | 持续时间,0表示不自动关闭 |
|
||
| position | string | middle | 显示位置:top \| middle \| bottom |
|
||
| iconName | string | - | 图标名称 |
|
||
| direction | string | - | 布局方向:horizontal \| vertical |
|
||
| cover | boolean | false | 是否显示遮罩 |
|
||
| show | boolean | true | 是否显示,内部状态字段 |
|
||
|
||
#### 参数形式
|
||
|
||
所有方法都支持两种调用方式:
|
||
|
||
1. 字符串:作为 msg 使用
|
||
2. 对象:传入完整 ToastOptions
|
||
|
||
## 全局弹窗
|
||
|
||
### 概述
|
||
|
||
GlobalDialog 基于 Wot UI 的 wd-dialog 封装,用于统一处理提醒、确认和输入等交互流程。
|
||
|
||
### 组件特性
|
||
|
||
- 基于 wd-dialog 实现
|
||
- 支持 alert、confirm、prompt 三种模式
|
||
- 支持 success、fail 回调
|
||
- 自动记录当前页面路径,只在触发页面展示
|
||
- 内部统一设置取消按钮和确认按钮为非圆角
|
||
|
||
### 使用
|
||
|
||
```ts
|
||
import { useGlobalDialog } from '@/composables/useGlobalDialog'
|
||
|
||
const dialog = useGlobalDialog()
|
||
```
|
||
|
||
### API
|
||
|
||
#### show(option)
|
||
|
||
显示通用弹窗。
|
||
|
||
```ts
|
||
dialog.show({
|
||
title: '提示',
|
||
msg: '这是一条消息',
|
||
success: (res) => console.log('成功', res),
|
||
fail: (res) => console.log('失败', res),
|
||
})
|
||
|
||
dialog.show('简单提示')
|
||
```
|
||
|
||
注意:当参数为字符串时,实际会作为 title 使用。
|
||
|
||
#### alert(option)
|
||
|
||
显示提醒弹窗,只显示确认按钮。
|
||
|
||
```ts
|
||
dialog.alert('操作完成')
|
||
|
||
dialog.alert({
|
||
title: '提醒',
|
||
msg: '请注意查看结果',
|
||
})
|
||
```
|
||
|
||
#### confirm(option)
|
||
|
||
显示确认弹窗,自动开启取消按钮。
|
||
|
||
```ts
|
||
dialog.confirm('确定要删除吗?')
|
||
|
||
dialog.confirm({
|
||
title: '确认删除',
|
||
msg: '删除后不可恢复,确定要删除吗?',
|
||
success: (res) => {
|
||
if (res.action === 'confirm') {
|
||
console.log('用户确认删除')
|
||
}
|
||
},
|
||
fail: (res) => {
|
||
console.log('用户取消删除')
|
||
},
|
||
})
|
||
```
|
||
|
||
#### prompt(option)
|
||
|
||
显示输入弹窗,自动开启取消按钮。
|
||
|
||
```ts
|
||
dialog.prompt('请输入您的姓名')
|
||
|
||
dialog.prompt({
|
||
title: '输入信息',
|
||
msg: '请输入新的名称',
|
||
inputValue: '默认值',
|
||
inputPlaceholder: '请输入内容',
|
||
success: (res) => {
|
||
if (res.action === 'confirm') {
|
||
console.log('用户输入:', res.value)
|
||
}
|
||
},
|
||
})
|
||
```
|
||
|
||
#### close()
|
||
|
||
手动关闭弹窗。
|
||
|
||
```ts
|
||
dialog.close()
|
||
```
|
||
|
||
### 参数说明
|
||
|
||
#### GlobalDialogOptions
|
||
|
||
GlobalDialogOptions 基于 Wot UI 的 DialogOptions 扩展,并额外支持 success、fail 回调。
|
||
|
||
| 参数 | 类型 | 默认值 | 说明 |
|
||
|------|------|--------|------|
|
||
| title | string | - | 弹窗标题 |
|
||
| msg | string | - | 弹窗内容 |
|
||
| type | string | - | 弹窗类型:alert \| confirm \| prompt |
|
||
| showCancelButton | boolean | 自动设置 | alert 为 false,confirm 和 prompt 为 true |
|
||
| inputValue | string | - | prompt 模式下的输入框默认值 |
|
||
| inputPlaceholder | string | - | prompt 模式下的输入框占位文案 |
|
||
| success | Function | - | 点击确认后的回调 |
|
||
| fail | Function | - | 取消或关闭后的回调 |
|
||
| confirmButtonText | string | 取决于 wd-dialog 默认值 | 确认按钮文本 |
|
||
| cancelButtonText | string | 取决于 wd-dialog 默认值 | 取消按钮文本 |
|
||
|
||
#### DialogResult
|
||
|
||
回调参数会透传 wd-dialog 的结果对象,常用字段如下:
|
||
|
||
| 参数 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| action | string | 用户操作:confirm \| cancel |
|
||
| value | string | 输入框的值,仅 prompt 模式可用 |
|
||
|
||
#### 参数形式
|
||
|
||
所有方法都支持两种调用方式:
|
||
|
||
1. 字符串:作为 title 使用
|
||
2. 对象:传入完整 GlobalDialogOptions
|
||
|
||
### 示例
|
||
|
||
```ts
|
||
const { confirm, alert, prompt } = useGlobalDialog()
|
||
const { success, warning } = useGlobalToast()
|
||
|
||
alert({
|
||
title: '重要提醒',
|
||
msg: '这是一个重要提醒',
|
||
})
|
||
|
||
confirm({
|
||
title: '确认操作',
|
||
msg: '确定继续吗?',
|
||
success: (res) => {
|
||
if (res.action === 'confirm') {
|
||
success('继续执行')
|
||
}
|
||
},
|
||
})
|
||
|
||
prompt({
|
||
title: '输入信息',
|
||
msg: '请输入您的姓名',
|
||
success: (res) => {
|
||
if (res.action === 'confirm' && String(res.value || '').trim()) {
|
||
success(`您好,${res.value}`)
|
||
}
|
||
else {
|
||
warning('输入不能为空')
|
||
}
|
||
},
|
||
})
|
||
```
|
||
|
||
## 典型场景
|
||
|
||
### 请求中间件中显示全局加载
|
||
|
||
```ts
|
||
const globalLoading = useGlobalLoading()
|
||
|
||
globalLoading.loading('请求中...')
|
||
|
||
try {
|
||
await request()
|
||
}
|
||
finally {
|
||
globalLoading.close()
|
||
}
|
||
```
|
||
|
||
### 路由守卫中显示确认弹窗
|
||
|
||
```ts
|
||
const { confirm } = useGlobalDialog()
|
||
|
||
confirm({
|
||
title: '离开当前页面',
|
||
msg: '表单尚未保存,确定离开吗?',
|
||
success: (res) => {
|
||
if (res.action === 'confirm') {
|
||
// 继续跳转
|
||
}
|
||
},
|
||
})
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. GlobalLoading 和 GlobalToast 底层都调用 wd-toast,但使用了不同 selector,不会互相覆盖。
|
||
2. GlobalDialog 使用 wd-dialog,内容字段应使用 msg,而不是 message。
|
||
3. 三个 composable 都会记录 currentPage,仅在触发时所在页面展示反馈。
|
||
4. 使用 duration: 0 的提示或加载时,需要手动调用 close()。
|
||
5. 支付宝小程序场景下组件内部做了兼容处理,业务侧无需额外处理。
|