Blazor 中实现 Toast 通知,核心是用一个可复用的组件管理状态、动画和生命周期,配合服务注入实现跨组件调用。不依赖 JS Interop 也能做,但加一点 CSS 动画会让体验更自然。
1. 创建 Toast 状态模型
定义通知的基本结构,包括内容、类型(success/warning/error)、持续时间、是否自动关闭等:
Id:唯一标识,用于单个关闭或清理 Message:显示文本(支持 MarkupString 可选) Type:枚举(Info / Success / Warning / Error)控制样式 AutoDismiss:true 表示定时自动消失 DurationMs:默认 3000ms,可覆盖2. 实现 ToastService(状态管理服务)
注册为 Scoped 服务,负责添加、移除、批量清除通知:
内部用 List3. 编写 Toast 组件(Toast.razor)
这是一个无逻辑的 UI 层,只负责渲染列表并绑定动画类:
用 @foreach 遍历 ToastService.Items,按顺序从上到下排列 每个 toast 添加 CSS 类如 toast toast--success fade-in,配合 opacity + transform 实现淡入滑入 用 @key="item.Id" 确保 Blazor 正确复用 DOM 元素 右上角 × 按钮调用 service.Dismiss(item.Id)4. 注册与使用
在 Program.cs 中注册服务:builder.Services.AddScoped
在 MainLayout.razor 或 App.razor 底部引入组件:
<Toast />
任意组件中注入并调用:
@inject ToastService Toast<br>@code {<br> private void OnSave() {<br> Toast.Show("保存成功!", ToastType.Success);<br> }<br>}
基本上就这些。不需要第三方库,轻量可控,样式和行为都容易按项目需求调整。
