@@ -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