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

React如何统一管理错误信息,在catch块直接调用展示toast提示

React项目统一抽离react-toast-notifications错误提示实现方案

因为react-toast-notifications提供的useToasts是React Hook,本身只能在React组件或者自定义Hook内部调用,以下提供两种常用实现方案按需选择即可。

方案一:封装自定义错误处理Hook(推荐,符合React规范)

无全局变量污染,适合仅在组件内部处理错误的场景。

  1. 新建统一错误处理文件 src/utils/useErrorHandler.js
import { useToasts } from 'react-toast-notifications';

export const useErrorHandler = () => {
  const { addToast } = useToasts();

  // 统一错误提示逻辑,可扩展错误上报、特殊码拦截等能力
  const showErrorToast = (error, customMessage = '操作失败') => {
    const errorMsg = error?.response?.data?.message || error?.message || customMessage;
    addToast(errorMsg, {
      appearance: 'error',
      autoDismiss: true,
      autoDismissTimeout: 3000
    });
  };

  return { showErrorToast };
};
  1. 组件内调用示例
import { useErrorHandler } from '@/utils/useErrorHandler';

const Index = () => {
  const { showErrorToast } = useErrorHandler();

  useEffect(() => {
    fetchDataFromApi()
      .then(data => {
        // 业务逻辑处理
      })
      .catch(error => showErrorToast(error, '数据加载失败'))
  }, [])

  // 其他业务逻辑
}

方案二:全局挂载实现全场景调用

支持在axios拦截器、普通工具函数等非组件环境触发提示。

  1. 根组件内将addToast挂载到全局变量
import { useToasts, ToastProvider } from 'react-toast-notifications';

// 全局存储Toast实例
window.__GLOBAL_TOAST__ = {};

const AppInit = () => {
  const { addToast } = useToasts();
  
  useEffect(() => {
    // 把错误提示方法挂载到全局
    window.__GLOBAL_TOAST__.addErrorToast = (error, customMessage = '操作失败') => {
      const errorMsg = error?.response?.data?.message || error?.message || customMessage;
      addToast(errorMsg, {
        appearance: 'error',
        autoDismiss: true,
        autoDismissTimeout: 3000
      });
    };
  }, [addToast]);

  return <App />;
}

// 根组件包裹ToastProvider
const Root = () => {
  return (
    <ToastProvider>
      <AppInit />
    </ToastProvider>
  )
}

export default Root;
  1. 新建统一错误处理工具文件 src/utils/errorHandler.js
export const showErrorToast = (...args) => {
  // 安全校验,避免实例未挂载时报错
  if (window.__GLOBAL_TOAST__?.addErrorToast) {
    window.__GLOBAL_TOAST__.addErrorToast(...args);
  }
};
  1. 任意场景调用示例
  • 组件catch中调用
import { showErrorToast } from '@/utils/errorHandler';

const Index = () => {
  useEffect(() => {
    fetchDataFromApi()
      .then(data => {
        // 业务逻辑处理
      })
      .catch(error => showErrorToast(error, '数据加载失败'))
  }, [])
}
  • axios响应拦截器中调用
import { showErrorToast } from '@/utils/errorHandler';

axios.interceptors.response.use(
  response => response,
  error => {
    showErrorToast(error);
    return Promise.reject(error);
  }
)

注意:两种方案都可以在统一方法中扩展通用逻辑,比如错误日志上报、登录过期跳转、权限不足拦截等,无需在每个业务组件重复实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:21:02