
许多开发者在使用 react-toastify 库时,可能会遇到从旧版本(如 v7.0.3)升级到新版本(如 v9.0.3)后,通知(toast)组件无法正常渲染的问题。尽管代码逻辑看似正确,且遵循了官方文档,但通知框却始终不显示。这通常发生在项目依赖升级后,尤其是在主要版本更新时。
用户通常会采取以下步骤:
然而,即便完成了这些步骤,通知仍可能无法显示。
在深入探讨解决方案之前,我们先对比一下旧版本(v7)和新版本(v9)中通知封装文件的主要差异,这有助于我们理解潜在的问题点。
v7.0.3 版本的 notifications.js 示例:
import { Notification } from '@scuf/common'; // 引入外部UI库的Notification组件
import './notifications.scss';
import 'react-toastify/dist/ReactToastify.css';
const ReactToastify = require('react-toastify');
export const toastnotify = (params) => {
ReactToastify.toast( // 将外部组件作为内容传递给toast
<Notification
hasIcon={true}
className="toast-notification"
severity={params.severity}
title={params.title}
>
{params.message || ""}
</Notification>
)
}
export const NotificationContainer = (props) => {
return(
<ReactToastify.ToastContainer // 使用ReactToastify.ToastContainer
hideProgressBar={true}
autoClose={12000}
closeOnClick={true}
closeButton={false}
newestOnTop={true}
position="bottom-right"
toastClassName="toast-notification-wrap"
/>
)
}v9.0.3 版本的 notifications.js 示例:
import React from "react";
import { ToastContainer, toast } from "react-toastify"; // 直接从react-toastify导入toast和ToastContainer
import "react-toastify/dist/ReactToastify.css";
// const ReactToastify = require("react-toastify"); // 此行在v9版本中变得多余或可能引起混淆
export const toastnotify = (params) => {
switch (params.severity) {
case "success":
toast.success(params.message, { /* 配置 */ }); // 直接使用toast.success等方法
break;
case "critical":
toast.error(params.message, { /* 配置 */ });
break;
case "warning":
toast.warn(params.message, { /* 配置 */ });
break;
default: toast(params.message);
break;
}
};
export const ToastNotificationsContainer = (props) => {
return (
<ToastContainer // 使用直接导入的ToastContainer
position="top-right"
autoClose={3000}
hideProgressBar={false}
newestOnTop={false}
closeOnClick
rtl={false}
pauseOnFocusLoss
draggable
pauseOnHover
theme="light" />
);
};
// 注意:这里存在另一个名为 NotificationContainer 的导出,其内部再次使用了 ReactToastify.ToastContainer
// 这可能导致在App.js中引入错误或产生多个ToastContainer实例
export const NotificationContainer = (props) => {
return (<ReactToastify.ToastContainer
hideProgressBar={true}
autoClose={3000}
closeOnClick={true}
closeButton={false}
newestOnTop={true}
position="top-right"
toastClassName="toast-notification-wrap" />);
};关键差异点:
经过分析,虽然代码逻辑上的改动(特别是 toastnotify 方法的实现)是符合新版本 API 的,但导致通知不渲染的根本原因,很可能并非代码逻辑错误,而是 React-Toastify 库在特定版本(如 v9.0.3)中存在的已知 bug。
社区中曾有用户报告在 9.0.3 版本中遇到类似的渲染问题,该问题在后续的补丁版本中得到了修复。
解决方案:
最直接有效的解决方案是升级 react-toastify 到修复了此问题的版本,例如 9.1.2 或更高版本。
yarn add react-toastify@latest # 或者指定版本 yarn add react-toastify@9.1.2
通过升级到最新的稳定版本,可以解决由于库内部 bug 导致的渲染问题。您可以在 React-Toastify 的 GitHub 仓库的 "Issues" 区找到相关讨论,例如 Issue #961 就提到了类似的问题。
除了升级库版本,以下最佳实践有助于确保 React-Toastify 的稳定和高效运行:
在整个应用中,只能渲染一个 ToastContainer 组件。将其放置在应用的根组件(如 App.js)中,确保它在所有需要显示通知的组件之上。
示例:App.js
import React, { Fragment } from 'react';
import { ToastContainer } from 'react-toastify'; // 确保只从这里导入一次
import 'react-toastify/dist/ReactToastify.css'; // 全局引入CSS
// 其他组件
import AppHeader from './AppHeader';
import AppSidebar from './AppSidebar';
import AppFooter from './AppFooter';
function App() {
return (
<Fragment>
<AppHeader />
<ToastContainer // 放置在应用的根部
position="top-right"
autoClose={5000}
hideProgressBar={false}
newestOnTop={false}
closeOnClick
rtl={false}
pauseOnFocusLoss
draggable
pauseOnHover
theme="light"
/>
<AppSidebar />
<AppFooter />
</Fragment>
);
}
export default App;创建一个专门的模块来封装 toast 调用,这样可以集中管理通知的样式和行为,提高代码的可维护性。
示例:shared/Notifications/notifications.js
import { toast } from "react-toastify"; // 仅导入toast函数
/**
* 封装的通知函数
* @param {object} params - 通知参数
* @param {string} params.severity - 通知类型 ('success', 'error', 'warning', 'info' 或 'default')
* @param {string} params.message - 通知内容
* @param {string} [params.title] - 通知标题 (如果需要自定义内容)
* @param {object} [params.options] - 覆盖默认配置的toast选项
*/
export const showToast = (params) => {
const defaultOptions = {
position: "top-right",
autoClose: 3000,
hideProgressBar: false,
closeOnClick: true,
pauseOnHover: true,
draggable: true,
progress: undefined,
theme: "light",
};
const options = { ...defaultOptions, ...params.options };
switch (params.severity) {
case "success":
toast.success(params.message, options);
break;
case "error":
toast.error(params.message, options);
break;
case "warning":
toast.warn(params.message, options);
break;
case "info":
toast.info(params.message, options);
break;
default:
toast(params.message, options);
break;
}
};
// 不需要在这里导出ToastContainer,因为它应该在App.js中直接使用确保 react-toastify/dist/ReactToastify.css 被全局引入,通常在 App.js 或入口文件中引入。
import 'react-toastify/dist/ReactToastify.css';
在需要显示通知的地方,直接调用封装好的 showToast 函数。
示例:组件内部调用
import React from 'react';
import { showToast } from "../../shared/Notifications/notifications"; // 导入封装的通知函数
function MyComponent() {
const handleClick = () => {
showToast({ severity: "success", message: "操作成功!" });
};
const handleError = () => {
showToast({ severity: "error", message: "无法获取日志详情。", options: { autoClose: 5000 } });
};
return (
<div>
<button onClick={handleClick}>显示成功通知</button>
<button onClick={handleError}>显示错误通知</button>
</div>
);
}
export default MyComponent;通过遵循这些最佳实践,并及时更新到稳定的库版本,可以有效解决 React-Toastify 在升级后可能出现的渲染问题,确保应用的通知功能正常运作。
以上就是解决 React-Toastify 升级后通知不渲染问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号