API 文档

MetonaToast v0.5.0 完整 API 参考。所有基础通知方法支持字符串与对象两种调用形式,均可传入任何配置项作为可选参数。

show(message, opts?)

显示默认类型 Toast,无特定颜色与图标。

show.js
// 字符串形式
MeToast.show('默认消息');
MeToast.show('自定义', { duration: 2000, position: 'bottom-center' });
// 对象形式
MeToast.show({ title: '标题', message: '内容', duration: 3000 });

success(message, opts?)

绿色对勾图标 #10b981,type = success。

success.js
MeToast.success('保存成功!');
MeToast.success({ title: '已保存', message: '数据已同步' });
Met.success('Met 与 MeToast 等价');

error(message, opts?)

红色叉号图标 #ef4444,type = error。aria-live = assertive。

error.js
MeToast.error('网络错误,请重试');
MeToast.error({ title: '提交失败', message: '服务器不可达' });

warning(message, opts?)

黄色三角图标 #f59e0b,type = warning。

warning.js
MeToast.warning('请注意检查输入内容');

info(message, opts?)

蓝色圆形图标 #3b82f6,type = info。

info.js
MeToast.info('系统将于 22:00 维护');

loading(message, opts?)

type = loading,duration 强制 0(不自动关闭)。返回 LoadingControl。

loading.js
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。

参数类型默认说明
promisePromise要监听的 Promise。非 Promise 打印错误并返回 rejected Promise
opts.loading / success / errorstring加载中... / 操作成功 / 操作失败各阶段文本
promise.js
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取消按钮文字与颜色
typewarningToast 类型
confirm.js
const ok = await MeToast.confirm('确定删除?', { confirmText: '删除', confirmColor: '#ef4444' });
if (ok) MeToast.success('已删除');

prompt(message, opts?)

输入对话框,返回 Promise<string|null>。Enter / 提交返回输入值,取消返回 null,10 秒超时。

参数默认说明
placeholder / defaultValue""输入框占位与默认值
inputTypetextinput 的 type(password/email/number 等)
submitText / submitColor确认 / #3b82f6提交按钮
cancelText / cancelColor取消 / #6b7280取消按钮
prompt.js
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()直接关闭
progress.js
const p = MeToast.progress('上传中...', { progressColor: '#10b981' });
p.setProgress(45);
p.complete('上传完成!');

countdown(message, seconds, opts?)

倒计时 Toast,{seconds} 占位符每秒自动替换。

参数默认说明
seconds10倒计时秒数,最小 1
opts.onComplete归零回调
countdown.js
MeToast.countdown('{seconds} 秒后执行', 5, { onComplete: () => MeToast.success('已执行') });
// 返回 { cancel(), pause(), resume() }

queue(messages, opts?)

顺序逐个显示消息队列,返回 thenable + cancel。支持 await。

参数默认说明
opts.delay1000每条关闭后到下一条的间隔(ms)
opts.duration3000每条显示时长,可被消息级 duration 覆盖
queue.js
const q = MeToast.queue(['步骤一', '步骤二', '步骤三'], { delay: 800, duration: 2000 });
q.cancel();  // 中途取消
await q;      // 等待完成

stack(messages, opts?)

同时错峰显示多条消息。

stack.js
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 优先)
closetrue点击后是否关闭。false 可多次点击
action.js
MeToast.action('文件已删除', [
  { text: '撤销', onClick: () => restore(), color: '#3b82f6' },
  { text: '查看', onClick: () => open(), color: '#10b981', close: false },
]);

group(name)

创建分组,返回 GroupAPI。所有方法自动注入 group: name

group.js
const orders = MeToast.group('orders');
orders.success('订单已创建');
orders.count();    // 该组数量
orders.dismiss();  // 关闭整组
MeToast.dismissGroup('orders');

dismiss(id?)

关闭 Toast。无参数关闭全部,传入 id 关闭指定。

dismiss.js
MeToast.dismiss();         // 全部
MeToast.dismiss(toast.id); // 指定

clear(position?)

按位置清除。

clear.js
MeToast.clear();                    // 全部
MeToast.clear('bottom-right'); // 仅右下角

updatePosition(position) v0.3

运行时将 Toast 移动到新位置容器,立即生效。

position.js
const t = MeToast.info('可移动的 Toast');
t.updatePosition('bottom-left');

remove() / removeToast(id) 立即移除

立即从 DOM 和内存移除,不触发离场动画。适用于无动画快速清除。

remove.js
t.remove();                  // 实例方法
MeToast.removeToast(t.id);    // 按 id(等价)

configure(opts)

全局配置,影响后续所有 Toast。theme/locale 变化触发副作用。

configure.js
MeToast.configure({
  position: 'top-right', duration: 4000, theme: 'dark',
  animation: 'slide', locale: 'zh-CN',
});

use(plugin)

安装插件:字符串预设名或插件对象。

use.js
MeToast.use('keyboard');      // ESC 关闭所有
MeToast.use('persistence');   // 配置持久化 localStorage
MeToast.use('accessibility'); // 屏幕阅读器朗读
MeToast.use('dedupe');        // 相同 type+message 自动去重

dedupe:检测已有相同 toast,更新它并阻止重复弹出(beforeShow 钩子实现,支持 uninstall 卸载钩子)。

destroy()

完全销毁:关闭所有 Toast、移除全部 DOM 容器与注入样式、清空内存缓存与钩子。支持重复调用,init() 可恢复。

destroy.js
MeToast.destroy();
MeToast.init({ config: { duration: 3000 } });  // 恢复

钩子系统 v0.3

Toast.on(name, handler) 注册钩子并返回取消函数。beforeShow / beforeClose / beforeUpdate 的 handler 返回 false 可拦截对应操作。

钩子触发时机拦截
beforeInit / afterInitinit() 前后
beforeDestroy / afterDestroydestroy() 前后
beforeShow / afterShow显示前后✅ 返回 false 阻止
beforeClose / afterClose关闭前后✅ 返回 false 阻止
beforeUpdate / afterUpdateupdate() 前后✅ 返回 false 阻止
configChangeconfigure / updateConfig / resetConfig
themeChange / localeChange主题 / 语言切换
click / hover点击 / 悬停进出
dragStart / dragEnd拖拽开始 / 结束
animationStart / animationEnd入场动画开始 / 结束
progressStart / progressEnd倒计时开始 / 归零
hooks.js
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。

react.tsx
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。

配置项类型默认值说明
positionstring'top-right'6 个位置之一(RTL 自动翻转)
durationnumber4000显示时长(ms),0 = 不自动关闭
maxnumber6同位置最多条数,超出真正关闭最早的
gapnumber12Toast 间距(px)
offsetnumber24容器距屏幕边缘(px)
pauseOnHoverbooleantrue悬停暂停倒计时
closeOnClickbooleantrue点击关闭
draggablebooleantrue允许拖拽关闭
dragThresholdnumber120拖拽关闭阈值(px)
showProgressbooleantrue显示倒计时进度条
progressDirectionstring'horizontal'horizontal / vertical
iconbooleantrue显示类型图标
closeButtonbooleantrue显示关闭 × 按钮
themestring'auto'light / dark / auto / warm / 自定义名
animationstring'slide'11 种内置或自定义动画名
zIndexnumber9999容器 z-index
widthnumber|string360宽度,数字表示 px
classNamestring''附加 CSS 类名
styleobject{}附加内联样式
localestring'zh-CN'语言代码
resetTimerOnUpdatebooleanfalseupdate() 时重置倒计时
notifyWhenHiddenbooleanfalse页面不可见时发系统通知
renderfunction自定义渲染函数,完全接管 DOM
onBeforeShowfunction返回 false 阻止显示
onErrorfunction钩子/定时器异常全局回调

回调函数

回调签名触发时机
onBeforeShow(toast) => boolean | voidDOM 创建前,返回 false 阻止显示
onShow(toast) => void创建并播放入场动画后
onClose(toast) => voidDOM 移除后(离场完成)
onClick(toast) => void点击时(closeOnClick=true 时还会关闭)
onUpdate(toast) => voidupdate() 后
onError({ hook, source, error, toast }) => void钩子/定时器异常时

动画列表

未注册的动画名自动 fallback 到 slide。

名称效果时长
slide从右侧滑入 + 回弹400ms
fade纯淡入 + blur→清晰500ms
scale弹性放大 (0.55→1.07→1)450ms
bounce从天而降四段弹跳650ms
flip3D 翻转入场 + 回摆500ms
rotate旋转摇摆进入500ms
zoom从中心爆发式弹出500ms
slideUp / slideDown从下方 / 上方弹入400ms
slideLeft / slideRight从左侧 / 右侧滑入400ms

主题参考

theme.js
// 内置主题: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');