diff --git a/biji-qianduan/src/components/HomePage.vue b/biji-qianduan/src/components/HomePage.vue index a5b184e..5e88ec4 100644 --- a/biji-qianduan/src/components/HomePage.vue +++ b/biji-qianduan/src/components/HomePage.vue @@ -552,18 +552,29 @@ const handleResize = () => { } }; +// 使用防抖优化 Vditor 渲染 +let renderTimeout = null; +let lastRenderedId = null; + watch([selectedFile, showEditor], ([newFile, newShowEditor]) => { if (newFile && !newShowEditor) { - nextTick(() => { - const previewElement = document.querySelector('.markdown-preview'); - if (previewElement) { - const contentToRender = (newFile.isPrivate === 1 && !userStore.isLoggedIn) ? privateNoteContent : newFile.content; - Vditor.preview(previewElement, contentToRender || '', { - mode: 'light', - hljs: { enable: true, style: 'github' } - }); - } - }); + // 如果同一个文件已经渲染过,跳过 + if (lastRenderedId === newFile.id) return; + + clearTimeout(renderTimeout); + renderTimeout = setTimeout(() => { + nextTick(() => { + const previewElement = document.querySelector('.markdown-preview'); + if (previewElement) { + const contentToRender = (newFile.isPrivate === 1 && !userStore.isLoggedIn) ? privateNoteContent : newFile.content; + Vditor.preview(previewElement, contentToRender || '', { + mode: 'light', + hljs: { enable: true, style: 'github' } + }); + lastRenderedId = newFile.id; + } + }); + }, 50); // 50ms 防抖 } }, { deep: true }); diff --git a/biji-qianduan/src/components/home/NotePreview.vue b/biji-qianduan/src/components/home/NotePreview.vue index 152d774..6440b07 100644 --- a/biji-qianduan/src/components/home/NotePreview.vue +++ b/biji-qianduan/src/components/home/NotePreview.vue @@ -82,26 +82,28 @@ const handleExport = (format) => { display: flex; justify-content: space-between; align-items: center; - margin-bottom: 1.5rem; - padding: 1rem; - background-color: rgba(255, 255, 255, 0.8); - backdrop-filter: blur(10px); + margin-bottom: 1rem; + padding: 0.75rem 1rem; + background-color: #ffffff; border-radius: var(--border-radius); - box-shadow: var(--box-shadow-light); + border: 1px solid #e4e7ed; gap: 1rem; + flex-shrink: 0; } .dark-theme .preview-header { - background-color: rgba(30, 30, 47, 0.8); + background-color: #1e1e2f; + border-color: #2c2c3d; } .preview-title { display: flex; align-items: center; - gap: 10px; + gap: 8px; flex-grow: 1; overflow: hidden; white-space: nowrap; + font-size: 1.1rem; } .preview-title span { @@ -110,9 +112,9 @@ const handleExport = (format) => { } .preview-title .edit-icon { - visibility: visible; - opacity: 0.6; + opacity: 0.5; cursor: pointer; + font-size: 16px; } .preview-title .edit-icon:hover { opacity: 1; @@ -120,21 +122,41 @@ const handleExport = (format) => { .actions { display: flex; - gap: 10px; + gap: 8px; align-items: center; + flex-shrink: 0; } .markdown-preview { flex-grow: 1; overflow-y: auto; - padding: 2rem; - background-color: rgba(255, 255, 255, 0.8); - backdrop-filter: blur(10px); + padding: 1.5rem; + background-color: #ffffff; border-radius: var(--border-radius); - box-shadow: var(--box-shadow-light); + border: 1px solid #e4e7ed; + will-change: scroll-position; } .dark-theme .markdown-preview { - background-color: rgba(30, 30, 47, 0.8); + background-color: #1e1e2f; + border-color: #2c2c3d; +} + +/* 优化滚动性能 */ +.markdown-preview::-webkit-scrollbar { + width: 8px; +} + +.markdown-preview::-webkit-scrollbar-track { + background: transparent; +} + +.markdown-preview::-webkit-scrollbar-thumb { + background-color: #c0c4cc; + border-radius: 4px; +} + +.markdown-preview::-webkit-scrollbar-thumb:hover { + background-color: #909399; }