You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chakra UI封装独立通知组件后如何避免toast重复弹出

Chakra UI 封装独立Toast通知后防重复弹出方案

问题根因

你之前的封装逻辑中,每次调用Notification函数都会重新执行createStandaloneToast生成全新的toast实例,不同实例之间的激活状态不共享,所以isActive判断无法生效。

修复步骤

1. 改造公共通知组件

将toast实例改为全局单例,新增id参数用于防重复判断,代码如下:

import React from 'react';
import { createStandaloneToast } from '@chakra-ui/react';
import theme from '../theme';

// 全局仅初始化一次toast实例,保证激活状态共享
const toast = createStandaloneToast({ theme: theme });

/**
 * 公共通知方法
 * @param {string} title 通知标题
 * @param {string} description 通知描述
 * @param {string} status 通知类型:success/error/warning/info
 * @param {string|number} [id] 可选通知唯一标识,用于防重复判断,不传则默认用标题+描述生成
 */
const Notification = (title, description, status, id) => {
  const toastId = id || `${title}-${description}`;
  
  // 仅当当前标识的通知未激活时才弹出
  if (!toast.isActive(toastId)) {
    toast({
      id: toastId,
      title,
      description,
      status,
      duration: 3000,
      position: 'bottom-right',
      isClosable: true,
    });
  }

  return <></>;
};

export default Notification;

2. 业务组件调用

调用时可选择传入自定义id,或者不传直接依赖默认的内容生成规则实现同内容通知防重复:

import React from 'react';
// ...其他引入

const RemoveToDo = () => {
    const remove = () => {
        // ...业务删除逻辑
        // 传入自定义唯一id,适配同内容但需要区分场景的需求
        Notification('Tarea eliminada.', 'Has eliminado la tarea.', 'success', 'remove-todo-success');
        
        // 也可以不传id,相同标题+描述的通知会自动去重
        // Notification('Tarea eliminada.', 'Has eliminado la tarea.', 'success');
    };
};

内容的提问来源于stack exchange,提问作者en44no

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:18:01