Sonner 轻量通知

用于轻量通知场景的 MoriUI 组件。

导入

import { Sonner, toast } from 'moriui'

示例

概览

触发 toast 通知。

<script setup lang="ts">
  import { Button, Sonner, toast } from 'moriui'
</script>

<template>
  <Sonner />
  <Button
    variant="outline"
    size="sm"
    @click="toast('事件已创建', {
      description: '2023 年 12 月 3 日星期日上午 9:00',
      action: {
        label: '撤销',
        onClick: () => console.log('撤销'),
      },
    })"
  >
    显示通知
  </Button>
</template>

类型

不同风格的通知。

<script setup lang="ts">
  import { Button, Sonner, toast } from 'moriui'
</script>

<template>
  <Sonner />
  <div class="flex flex-wrap gap-2">
    <Button variant="outline" size="sm" @click="toast('默认通知')">
      默认
    </Button>
    <Button variant="outline" size="sm" @click="toast.success('操作成功')">
      成功
    </Button>
    <Button variant="outline" size="sm" @click="toast.info('请在活动开始前 10 分钟到达现场')">
      信息
    </Button>
    <Button variant="outline" size="sm" @click="toast.warning('活动开始时间不能早于上午 8 点')">
      警告
    </Button>
    <Button variant="outline" size="sm" @click="toast.error('操作失败')">
      错误
    </Button>
    <Button
      variant="outline"
      size="sm"
      @click="toast.promise<{ name: string }>(
        () => new Promise(resolve => setTimeout(() => resolve({ name: '活动' }), 2000)),
        {
          loading: '加载中…',
          success: data => `${data.name}已创建`,
          error: '创建失败',
        },
      )"
    >
      异步
    </Button>
  </div>
</template>

描述

带描述和操作的通知。

<script setup lang="ts">
  import { Button, Sonner, toast } from 'moriui'
</script>

<template>
  <Sonner />
  <div class="flex flex-wrap gap-2">
    <Button
      variant="outline"
      size="sm"
      @click="toast('事件已创建', {
        description: '2023 年 1 月 3 日星期一下午 6:00',
      })"
    >
      仅描述
    </Button>
    <Button
      variant="outline"
      size="sm"
      @click="toast('文件已上传', {
        description: '报告文档已保存到项目文件夹',
        action: {
          label: '打开',
          onClick: () => console.log('打开文件'),
        },
      })"
    >
      带操作按钮
    </Button>
  </div>
</template>

位置

通知出现位置。

<script setup lang="ts">
  import { Button, Sonner, toast } from 'moriui'
</script>

<template>
  <Sonner />
  <div class="flex flex-wrap justify-center gap-2">
    <Button variant="outline" size="sm" @click="toast('事件已创建', { position: 'top-left' })">
      左上
    </Button>
    <Button variant="outline" size="sm" @click="toast('事件已创建', { position: 'top-center' })">
      顶部居中
    </Button>
    <Button variant="outline" size="sm" @click="toast('事件已创建', { position: 'top-right' })">
      右上
    </Button>
    <Button variant="outline" size="sm" @click="toast('事件已创建', { position: 'bottom-left' })">
      左下
    </Button>
    <Button variant="outline" size="sm" @click="toast('事件已创建', { position: 'bottom-center' })">
      底部居中
    </Button>
    <Button variant="outline" size="sm" @click="toast('事件已创建', { position: 'bottom-right' })">
      右下
    </Button>
  </div>
</template>

使用说明

使用方式

安装 Sonner 到应用根节点,通过 toast API 触发通知。

类型

toast API 支持 default/success/error/info/warning 类型。

位置

position 控制通知的出现位置(如 top-right、bottom-center)。

RTL

通知内容沿 dir 排列。

变体

Sonner 的 position 支持 top-left/top-center/top-right/bottom-left/bottom-center/bottom-right。

可访问性

Sonner 使用 role="status" 和 aria-live="polite" 确保通知被屏幕阅读器朗读。可交互的通知应包含操作按钮。

API 参考

属性类型默认值说明
Sonner positionSonnerPosition'bottom-right'通知出现位置。
Sonner durationnumber4000通知显示的毫秒数。
Sonner closeButtonbooleanfalse是否显示关闭按钮。
Sonner richColorsbooleanfalse是否使用丰富的颜色方案。
toast()(message: string) => string触发默认通知。
toast.success()(message: string) => string触发成功通知。
toast.error()(message: string) => string触发错误通知。
toast.info()(message: string) => string触发信息通知。
toast.warning()(message: string) => string触发警告通知。