优化评查详情,新增信息提示框组件

This commit is contained in:
2025-04-23 20:48:32 +08:00
parent ee36ce2620
commit be99fdec79
15 changed files with 1399 additions and 757 deletions
+17 -6
View File
@@ -54,6 +54,7 @@ export function Toast({
const [isClosing, setIsClosing] = useState(false);
const [portalElement, setPortalElement] = useState<HTMLElement | null>(null);
const [messageLines, setMessageLines] = useState<number>(1);
const [isHovered, setIsHovered] = useState(false);
// 在客户端渲染时获取 portal 容器
useEffect(() => {
@@ -89,7 +90,7 @@ export function Toast({
// 自动关闭
useEffect(() => {
if (isOpen && autoClose) {
if (isOpen && autoClose && !isHovered) {
// 根据消息长度调整显示时间,长消息显示更长时间
const adjustedDelay = Math.min(
autoCloseDelay + (message.length > 100 ? 2000 : 0),
@@ -101,7 +102,16 @@ export function Toast({
}, adjustedDelay);
return () => clearTimeout(timer);
}
}, [isOpen, autoClose, autoCloseDelay, handleClose, message]);
}, [isOpen, autoClose, autoCloseDelay, handleClose, message, isHovered]);
// 鼠标悬停处理
const handleMouseEnter = () => {
setIsHovered(true);
};
const handleMouseLeave = () => {
setIsHovered(false);
};
// 渲染图标
const renderIcon = () => {
@@ -138,10 +148,10 @@ export function Toast({
return createPortal(
<div
className={`toast toast-${type} ${isClosing ? 'closing' : ''} ${className} ${messageLines > 3 ? 'toast-multiline' : ''}`}
role="alert"
aria-live="assertive"
onKeyDown={handleKeyDown}
tabIndex={0}
role="status"
aria-live="polite"
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
>
<div className="toast-content">
<div className="toast-icon-wrapper">
@@ -155,6 +165,7 @@ export function Toast({
className="toast-close"
onClick={handleClose}
aria-label="关闭"
onKeyDown={handleKeyDown}
>
<i className="ri-close-line"></i>
</button>