Skip to content

Commit 6b2679d

Browse files
committed
perf(notes): P1-7 笔记列表过滤/标签/选中结果 useMemo 缓存
NotesPage 原在每次渲染都调用 getFilteredNotes()/getAllTags() 全量 filter+sort 所有笔记(搜索时对每篇 content 全量扫描),配合整 store 订阅导致搜索/切换卡顿。现订阅 notes 并用 useMemo 缓存 filteredNotes/allTags/selectedNote,仅在笔记/搜索/标签/文件夹变化时重算。
1 parent 976ad27 commit 6b2679d

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

‎client/src/features/notes/pages/NotesPage.tsx‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ export default function NotesPage() {
115115
const navigate = useNavigate();
116116

117117
const {
118-
folders, selectedFolderId, selectedNoteId, searchQuery, selectedTags,
118+
notes, folders, selectedFolderId, selectedNoteId, searchQuery, selectedTags,
119119
loadNotes, loadFolders, createNote, createFolder, updateFolder, selectNote, selectFolder,
120120
setSearchQuery, getFilteredNotes, createFromTemplate, toggleTag, getAllTags,
121121
deleteNote, togglePin,
@@ -136,9 +136,17 @@ export default function NotesPage() {
136136
// eslint-disable-next-line react-hooks/exhaustive-deps
137137
useEffect(() => { loadNotes(); loadFolders(); }, []);
138138

139-
const filteredNotes = getFilteredNotes();
140-
const allTags = getAllTags();
141-
const selectedNote = filteredNotes.find((n) => n.id === selectedNoteId) || null;
139+
// 缓存过滤/标签/选中结果,避免每次渲染都全量 filter/sort 所有笔记(P1-7 性能修复)
140+
const filteredNotes = useMemo(
141+
() => getFilteredNotes(),
142+
// eslint-disable-next-line react-hooks/exhaustive-deps -- 依赖 getFilteredNotes 读取的 store 字段
143+
[getFilteredNotes, notes, searchQuery, selectedTags, selectedFolderId, folders],
144+
);
145+
const allTags = useMemo(() => getAllTags(), [getAllTags, notes]);
146+
const selectedNote = useMemo(
147+
() => filteredNotes.find((n) => n.id === selectedNoteId) || null,
148+
[filteredNotes, selectedNoteId],
149+
);
142150

143151
const handleTemplateSelect = async (tpl: NoteTemplate) => {
144152
const id = await createFromTemplate(tpl, selectedFolderId ?? undefined);

0 commit comments

Comments
 (0)