From 70580a9a6314a9cff6b3ff0704a8e581eaafd292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=A8=E9=9C=96=E9=93=83?= Date: Thu, 21 May 2026 00:12:06 +0800 Subject: [PATCH] =?UTF-8?q?fix(qrcode):=20=E4=BF=AE=E5=A4=8D=E5=88=87?= =?UTF-8?q?=E6=8D=A2=20tab=20=E5=90=8E=E4=BA=8C=E7=BB=B4=E7=A0=81=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=A4=B1=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 ImageUploader 组件卸载时的预览 URL 释放逻辑 - 在 useQrCode hook 中统一管理预览 URL 生命周期 - 创建新预览 URL 前释放旧的,避免内存泄漏 --- components/ImageUploader.tsx | 9 --------- pages/QrCode/hooks/useQrCode.ts | 20 +++++++++++++------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/components/ImageUploader.tsx b/components/ImageUploader.tsx index fbecd52..a760f29 100644 --- a/components/ImageUploader.tsx +++ b/components/ImageUploader.tsx @@ -36,15 +36,6 @@ const ImageUploader = ({ const { showMessage } = useSnackbar(); const fileInputRef = useRef(null); - // 清理预览 URL,防止内存泄漏 - useEffect(() => { - return () => { - if (previewUrl) { - URL.revokeObjectURL(previewUrl); - } - }; - }, [previewUrl]); - const handleFileChange = useCallback( (file: File) => { onFileChange(file); diff --git a/pages/QrCode/hooks/useQrCode.ts b/pages/QrCode/hooks/useQrCode.ts index a18f146..cf1769d 100644 --- a/pages/QrCode/hooks/useQrCode.ts +++ b/pages/QrCode/hooks/useQrCode.ts @@ -162,13 +162,19 @@ export function useQrCode(): QrCodeContextValue { // 处理文件选择 const handleFileChange = useCallback( (file: File) => { - setParserState((prev) => ({ - ...prev, - selectedFile: file, - previewUrl: URL.createObjectURL(file), - decodedResult: '', - parseError: '', - })); + setParserState((prev) => { + // 释放旧的预览 URL + if (prev.previewUrl) { + URL.revokeObjectURL(prev.previewUrl); + } + return { + ...prev, + selectedFile: file, + previewUrl: URL.createObjectURL(file), + decodedResult: '', + parseError: '', + }; + }); // 自动解析 parseQrCode(file); },