API 文档
MetonaToast v0.5.0 完整 API 参考。所有基础通知方法支持字符串与对象两种调用形式,均可传入任何配置项作为可选参数。
show(message, opts?)
显示默认类型 Toast,无特定颜色与图标。
// 字符串形式 MeToast.show('默认消息'); MeToast.show('自定义', { duration: 2000, position: 'bottom-center' }); // 对象形式 MeToast.show({ title: '标题', message: '内容', duration: 3000 });
success(message, opts?)
绿色对勾图标 #10b981,type = success。
MeToast.success('保存成功!'); MeToast.success({ title: '已保存', message: '数据已同步' }); Met.success('Met 与 MeToast 等价');
error(message, opts?)
红色叉号图标 #ef4444,type = error。aria-live = assertive。
MeToast.error('网络错误,请重试'); MeToast.error({ title: '提交失败', message: '服务器不可达' });
warning(message, opts?)
黄色三角图标 #f59e0b,type = warning。
MeToast.warning('请注意检查输入内容');
info(message, opts?)
蓝色圆形图标 #3b82f6,type = info。
MeToast.info('系统将于 22:00 维护');
loading(message, opts?)
type = loading,duration 强制 0(不自动关闭)。返回 LoadingControl。
const loading = MeToast.loading('正在提交...'); setTimeout(() => loading.success('提交成功!'), 2000);
LoadingControl(链式转换 id 稳定)
| 方法 | 说明 |
|---|---|
| success/error/info/warning | 原地更新为对应类型(同一实例,id 不变),duration 自动恢复默认值 |
| update(partial) | 原地更新内容,不改变类型 |
| dismiss() | 直接关闭,不转换 |
promise(promise, opts)
监听 Promise 生命周期,自动 loading → resolve/reject 切换 success/error,返回原 Promise。
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
| promise | Promise | — | 要监听的 Promise。非 Promise 打印错误并返回 rejected Promise |
| opts.loading / success / error | string | 加载中... / 操作成功 / 操作失败 | 各阶段文本 |
try { await MeToast.promise(fetch('/api/data'), { loading: '加载中...', success: '完成!', error: '失败', }); } catch (e) { /* reject 会继续抛出 */ }
confirm(message, opts?)
确认对话框,返回 Promise<boolean>,内置 10 秒安全超时自动 resolve(false)。
| 参数 | 默认 | 说明 |
|---|---|---|
| confirmText / confirmColor | 确认 / #10b981 | 确认按钮文字与颜色 |
| cancelText / cancelColor | 取消 / #6b7280 | 取消按钮文字与颜色 |
| type | warning | Toast 类型 |
const ok = await MeToast.confirm('确定删除?', { confirmText: '删除', confirmColor: '#ef4444' }); if (ok) MeToast.success('已删除');
prompt(message, opts?)
输入对话框,返回 Promise<string|null>。Enter / 提交返回输入值,取消返回 null,10 秒超时。
| 参数 | 默认 | 说明 |
|---|---|---|
| placeholder / defaultValue | "" | 输入框占位与默认值 |
| inputType | text | input 的 type(password/email/number 等) |
| submitText / submitColor | 确认 / #3b82f6 | 提交按钮 |
| cancelText / cancelColor | 取消 / #6b7280 | 取消按钮 |
const name = await MeToast.prompt('请输入姓名', { placeholder: '请输入...' }); if (name) MeToast.info('你好,' + name);
progress(message, opts?)
进度条通知,不自动关闭。返回 ProgressControl。
| 方法 | 说明 |
|---|---|
| setProgress(percent) | 设置进度 0~100,自动 clamp |
| complete(message?) | 跳 100%,300ms 后转 success,1s 后自动关闭 |
| error(message?) | 转 error,2s 后自动关闭 |
| dismiss() | 直接关闭 |
const p = MeToast.progress('上传中...', { progressColor: '#10b981' }); p.setProgress(45); p.complete('上传完成!');
countdown(message, seconds, opts?)
倒计时 Toast,{seconds} 占位符每秒自动替换。
| 参数 | 默认 | 说明 |
|---|---|---|
| seconds | 10 | 倒计时秒数,最小 1 |
| opts.onComplete | — | 归零回调 |
MeToast.countdown('{seconds} 秒后执行', 5, { onComplete: () => MeToast.success('已执行') }); // 返回 { cancel(), pause(), resume() }
queue(messages, opts?)
顺序逐个显示消息队列,返回 thenable + cancel。支持 await。
| 参数 | 默认 | 说明 |
|---|---|---|
| opts.delay | 1000 | 每条关闭后到下一条的间隔(ms) |
| opts.duration | 3000 | 每条显示时长,可被消息级 duration 覆盖 |
const q = MeToast.queue(['步骤一', '步骤二', '步骤三'], { delay: 800, duration: 2000 }); q.cancel(); // 中途取消 await q; // 等待完成
stack(messages, opts?)
同时错峰显示多条消息。
MeToast.stack(['消息1', '消息2', { message: '警告', type: 'warning' }], { stagger: 150 });
action(message, actions, opts?)
内嵌操作按钮。默认 duration=0 不自动关闭。点击按钮不会误触 closeOnClick(已隔离冒泡)。
| ActionButton | 默认 | 说明 |
|---|---|---|
| text | —(必填) | 按钮文字 |
| onClick | —(必填) | 点击回调,参数为当前 toast |
| color / style | #6366f1 | 背景色 / 内联样式(style.background 优先) |
| close | true | 点击后是否关闭。false 可多次点击 |
MeToast.action('文件已删除', [ { text: '撤销', onClick: () => restore(), color: '#3b82f6' }, { text: '查看', onClick: () => open(), color: '#10b981', close: false }, ]);
group(name)
创建分组,返回 GroupAPI。所有方法自动注入 group: name。
const orders = MeToast.group('orders'); orders.success('订单已创建'); orders.count(); // 该组数量 orders.dismiss(); // 关闭整组 MeToast.dismissGroup('orders');
dismiss(id?)
关闭 Toast。无参数关闭全部,传入 id 关闭指定。
MeToast.dismiss(); // 全部 MeToast.dismiss(toast.id); // 指定
clear(position?)
按位置清除。
MeToast.clear(); // 全部 MeToast.clear('bottom-right'); // 仅右下角
updatePosition(position) v0.3
运行时将 Toast 移动到新位置容器,立即生效。
const t = MeToast.info('可移动的 Toast'); t.updatePosition('bottom-left');
remove() / removeToast(id) 立即移除
立即从 DOM 和内存移除,不触发离场动画。适用于无动画快速清除。
t.remove(); // 实例方法 MeToast.removeToast(t.id); // 按 id(等价)
configure(opts)
全局配置,影响后续所有 Toast。theme/locale 变化触发副作用。
MeToast.configure({ position: 'top-right', duration: 4000, theme: 'dark', animation: 'slide', locale: 'zh-CN', });
use(plugin)
安装插件:字符串预设名或插件对象。
MeToast.use('keyboard'); // ESC 关闭所有 MeToast.use('persistence'); // 配置持久化 localStorage MeToast.use('accessibility'); // 屏幕阅读器朗读 MeToast.use('dedupe'); // 相同 type+message 自动去重
dedupe:检测已有相同 toast,更新它并阻止重复弹出(beforeShow 钩子实现,支持 uninstall 卸载钩子)。
destroy()
完全销毁:关闭所有 Toast、移除全部 DOM 容器与注入样式、清空内存缓存与钩子。支持重复调用,init() 可恢复。
MeToast.destroy(); MeToast.init({ config: { duration: 3000 } }); // 恢复
钩子系统 v0.3
Toast.on(name, handler) 注册钩子并返回取消函数。beforeShow / beforeClose / beforeUpdate 的 handler 返回 false 可拦截对应操作。
| 钩子 | 触发时机 | 拦截 |
|---|---|---|
| beforeInit / afterInit | init() 前后 | — |
| beforeDestroy / afterDestroy | destroy() 前后 | — |
| beforeShow / afterShow | 显示前后 | ✅ 返回 false 阻止 |
| beforeClose / afterClose | 关闭前后 | ✅ 返回 false 阻止 |
| beforeUpdate / afterUpdate | update() 前后 | ✅ 返回 false 阻止 |
| configChange | configure / updateConfig / resetConfig | — |
| themeChange / localeChange | 主题 / 语言切换 | — |
| click / hover | 点击 / 悬停进出 | — |
| dragStart / dragEnd | 拖拽开始 / 结束 | — |
| animationStart / animationEnd | 入场动画开始 / 结束 | — |
| progressStart / progressEnd | 倒计时开始 / 归零 | — |
import MeToast, { Toast } from '@metona-team/metona-toast'; // 拦截:非允许时段禁止错误提示 const off = Toast.on('beforeShow', (toast) => { if (toast.type === 'error' && !isAllowed) return false; }); // ... off(); // 取消注册
React 适配器 v0.4
主包保持零依赖。通过子路径 @metona-team/metona-toast/react 导入,react 为 optional peerDependency。
import { useToast, Toast } from '@metona-team/metona-toast/react'; function SubmitButton() { const toast = useToast(); // 组件卸载自动清理本组件创建的 Toast const submit = async () => { const loading = toast.loading('正在提交...'); try { await api(); loading.success('完成!'); } catch (e) { loading.error('失败'); } }; return <button onClick={submit}>提交</button>; } // 声明式 Toast:props 变化更新,卸载自动移除(autoClose 默认 true) function SaveIndicator({ saving }) { return saving ? <Toast type="info" message="正在保存..." /> : null; }
全部配置项
可用于 configure()、init() 或单个 Toast 方法的 opts。
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| position | string | 'top-right' | 6 个位置之一(RTL 自动翻转) |
| duration | number | 4000 | 显示时长(ms),0 = 不自动关闭 |
| max | number | 6 | 同位置最多条数,超出真正关闭最早的 |
| gap | number | 12 | Toast 间距(px) |
| offset | number | 24 | 容器距屏幕边缘(px) |
| pauseOnHover | boolean | true | 悬停暂停倒计时 |
| closeOnClick | boolean | true | 点击关闭 |
| draggable | boolean | true | 允许拖拽关闭 |
| dragThreshold | number | 120 | 拖拽关闭阈值(px) |
| showProgress | boolean | true | 显示倒计时进度条 |
| progressDirection | string | 'horizontal' | horizontal / vertical |
| icon | boolean | true | 显示类型图标 |
| closeButton | boolean | true | 显示关闭 × 按钮 |
| theme | string | 'auto' | light / dark / auto / warm / 自定义名 |
| animation | string | 'slide' | 11 种内置或自定义动画名 |
| zIndex | number | 9999 | 容器 z-index |
| width | number|string | 360 | 宽度,数字表示 px |
| className | string | '' | 附加 CSS 类名 |
| style | object | {} | 附加内联样式 |
| locale | string | 'zh-CN' | 语言代码 |
| resetTimerOnUpdate | boolean | false | update() 时重置倒计时 |
| notifyWhenHidden | boolean | false | 页面不可见时发系统通知 |
| render | function | — | 自定义渲染函数,完全接管 DOM |
| onBeforeShow | function | — | 返回 false 阻止显示 |
| onError | function | — | 钩子/定时器异常全局回调 |
回调函数
| 回调 | 签名 | 触发时机 |
|---|---|---|
| onBeforeShow | (toast) => boolean | void | DOM 创建前,返回 false 阻止显示 |
| onShow | (toast) => void | 创建并播放入场动画后 |
| onClose | (toast) => void | DOM 移除后(离场完成) |
| onClick | (toast) => void | 点击时(closeOnClick=true 时还会关闭) |
| onUpdate | (toast) => void | update() 后 |
| onError | ({ hook, source, error, toast }) => void | 钩子/定时器异常时 |
动画列表
未注册的动画名自动 fallback 到 slide。
| 名称 | 效果 | 时长 |
|---|---|---|
| slide | 从右侧滑入 + 回弹 | 400ms |
| fade | 纯淡入 + blur→清晰 | 500ms |
| scale | 弹性放大 (0.55→1.07→1) | 450ms |
| bounce | 从天而降四段弹跳 | 650ms |
| flip | 3D 翻转入场 + 回摆 | 500ms |
| rotate | 旋转摇摆进入 | 500ms |
| zoom | 从中心爆发式弹出 | 500ms |
| slideUp / slideDown | 从下方 / 上方弹入 | 400ms |
| slideLeft / slideRight | 从左侧 / 右侧滑入 | 400ms |
主题参考
// 内置主题:light · dark · auto(跟随系统)· warm MeToast.themes.registerTheme('ocean', { bg: 'rgba(240,249,255,0.96)', text: '#0c4a6e', border: 'rgba(14,165,233,0.2)', shadow: '0 10px 36px -10px rgba(14,165,233,0.18)', hoverShadow: '0 14px 48px -10px rgba(14,165,233,0.22)', progressBg: 'rgba(14,165,233,0.1)', closeHoverBg: 'rgba(14,165,233,0.1)', }); MeToast.themes.switchTheme('ocean');