diff --git a/src/renderer/src/components/Preview/MermaidPreview.tsx b/src/renderer/src/components/Preview/MermaidPreview.tsx index 86e0339c2f..4c41e3c4b9 100644 --- a/src/renderer/src/components/Preview/MermaidPreview.tsx +++ b/src/renderer/src/components/Preview/MermaidPreview.tsx @@ -18,7 +18,7 @@ const MermaidPreview = ({ enableToolbar = false, ref }: BasicPreviewProps & { ref?: React.RefObject }) => { - const { mermaid, isLoading: isLoadingMermaid, error: mermaidError } = useMermaid() + const { mermaid, isLoading: isLoadingMermaid, error: mermaidError, forceRenderKey } = useMermaid() const diagramId = useRef(`mermaid-${nanoid(6)}`).current const [isVisible, setIsVisible] = useState(true) @@ -56,7 +56,7 @@ const MermaidPreview = ({ document.body.removeChild(measureEl) } }, - [diagramId, mermaid] + [diagramId, mermaid, forceRenderKey] ) // 可见性检测函数 diff --git a/src/renderer/src/components/Preview/__tests__/MermaidPreview.test.tsx b/src/renderer/src/components/Preview/__tests__/MermaidPreview.test.tsx index 17ada0668c..2db61dd2dd 100644 --- a/src/renderer/src/components/Preview/__tests__/MermaidPreview.test.tsx +++ b/src/renderer/src/components/Preview/__tests__/MermaidPreview.test.tsx @@ -60,7 +60,8 @@ describe('MermaidPreview', () => { mocks.useMermaid.mockReturnValue({ mermaid: mockMermaid, isLoading: false, - error: null + error: null, + forceRenderKey: 0 }) mocks.useDebouncedRender.mockReturnValue(createMockHookReturn()) @@ -116,7 +117,8 @@ describe('MermaidPreview', () => { mocks.useMermaid.mockReturnValue({ mermaid: mockMermaid, isLoading: true, - error: null + error: null, + forceRenderKey: 0 }) render({mermaidCode}) @@ -145,7 +147,8 @@ describe('MermaidPreview', () => { mocks.useMermaid.mockReturnValue({ mermaid: mockMermaid, isLoading: false, - error: mermaidError + error: mermaidError, + forceRenderKey: 0 }) render({mermaidCode}) @@ -173,7 +176,8 @@ describe('MermaidPreview', () => { mocks.useMermaid.mockReturnValue({ mermaid: mockMermaid, isLoading: false, - error: mermaidError + error: mermaidError, + forceRenderKey: 0 }) mocks.useDebouncedRender.mockReturnValue(createMockHookReturn({ error: renderError })) diff --git a/src/renderer/src/hooks/useMermaid.ts b/src/renderer/src/hooks/useMermaid.ts index 1ef9b43069..c1a80be2e6 100644 --- a/src/renderer/src/hooks/useMermaid.ts +++ b/src/renderer/src/hooks/useMermaid.ts @@ -33,6 +33,7 @@ export const useMermaid = () => { const { theme } = useTheme() const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) + const [forceRenderKey, setForceRenderKey] = useState(0) // 初始化 mermaid 并监听主题变化 useEffect(() => { @@ -51,6 +52,7 @@ export const useMermaid = () => { theme: theme === ThemeMode.dark ? 'dark' : 'default' }) + setForceRenderKey((prev) => prev + 1) setError(null) } catch (error) { setError(error instanceof Error ? error.message : 'Failed to initialize Mermaid') @@ -71,6 +73,7 @@ export const useMermaid = () => { return { mermaid: mermaidModule, isLoading, - error + error, + forceRenderKey } }