66 lines
1.9 KiB
TypeScript
66 lines
1.9 KiB
TypeScript
/**
|
|
* toast 弹窗组件
|
|
* 支持 success/error/warning/info 四种状态
|
|
* 可配置 duration, position 等参数
|
|
*/
|
|
|
|
type ToastType = 'success' | 'error' | 'warning' | 'info'
|
|
|
|
interface ToastOptions {
|
|
type?: ToastType
|
|
duration?: number
|
|
position?: 'top' | 'middle' | 'bottom'
|
|
icon?: 'success' | 'error' | 'none' | 'loading' | 'fail' | 'exception'
|
|
message: string
|
|
}
|
|
|
|
export function showToast(options: ToastOptions | string) {
|
|
const defaultOptions: ToastOptions = {
|
|
type: 'info',
|
|
duration: 2000,
|
|
position: 'middle',
|
|
message: '',
|
|
}
|
|
const mergedOptions
|
|
= typeof options === 'string'
|
|
? { ...defaultOptions, message: options }
|
|
: { ...defaultOptions, ...options }
|
|
// 映射position到uniapp支持的格式
|
|
const positionMap: Record<ToastOptions['position'], 'top' | 'bottom' | 'center'> = {
|
|
top: 'top',
|
|
middle: 'center',
|
|
bottom: 'bottom',
|
|
}
|
|
|
|
// 映射图标类型
|
|
const iconMap: Record<
|
|
ToastType,
|
|
'success' | 'error' | 'none' | 'loading' | 'fail' | 'exception'
|
|
> = {
|
|
success: 'success',
|
|
error: 'error',
|
|
warning: 'fail',
|
|
info: 'none',
|
|
}
|
|
|
|
// 调用uni.showToast显示提示
|
|
uni.showToast({
|
|
title: mergedOptions.message,
|
|
duration: mergedOptions.duration,
|
|
position: positionMap[mergedOptions.position],
|
|
icon: mergedOptions.icon || iconMap[mergedOptions.type],
|
|
mask: true,
|
|
})
|
|
}
|
|
|
|
export const toast = {
|
|
success: (message: string, options?: Omit<ToastOptions, 'type'>) =>
|
|
showToast({ ...options, type: 'success', message }),
|
|
error: (message: string, options?: Omit<ToastOptions, 'type'>) =>
|
|
showToast({ ...options, type: 'error', message }),
|
|
warning: (message: string, options?: Omit<ToastOptions, 'type'>) =>
|
|
showToast({ ...options, type: 'warning', message }),
|
|
info: (message: string, options?: Omit<ToastOptions, 'type'>) =>
|
|
showToast({ ...options, type: 'info', message }),
|
|
}
|