@@ -66,6 +66,9 @@ interface Props {
6666 /** REQ-316(批 7):移组触发空组自动清理 → 上抛组标题(父层 toast 留痕) */
6767 onCleanNotice ?: ( groupNames : string [ ] ) => void ;
6868 onCollapse ?: ( ) => void ;
69+ /** 外部重载令牌(NotesPage refreshToken——侧栏手排/置顶/回自动经 onChanged
70+ * 递增;本组件据此重拉组序行与笔记序行,树组头与侧栏保持同序) */
71+ refreshToken ?: number ;
6972}
7073
7174/** scope 键(组/null=未分组) */
@@ -90,6 +93,7 @@ export default function NoteListView({
9093 noteColors, tagColors,
9194 onKeywordChange, onTagFilterChange, onSortModeChange, onSelect, onCreate, onRefresh, onOpenSession, onBatchDelete,
9295 onNotePinToggle, onNoteEdit, onNoteDelete, onNoteMoved, onCleanNotice, onCollapse,
96+ refreshToken = 0 ,
9397} : Props ) {
9498 const theme : ThemeMode = useMemo (
9599 ( ) => ( typeof window !== "undefined" && window . matchMedia ?.( "(prefers-color-scheme: dark)" ) . matches ? "dark" : "light" ) ,
@@ -147,7 +151,11 @@ export default function NoteListView({
147151 return ( ) => window . removeEventListener ( "keydown" , onKey ) ;
148152 } , [ batchMenu , contextMenu , selectionMode , selection . size , exitBatch ] ) ;
149153
150- // 手动序装载(REQ-287:notes 行)+ REQ-315:组序行(树组头排序)
154+ // 手动序装载(REQ-287:notes 行)+ REQ-315:组序行(树组头排序)。
155+ // Why 依赖 refreshToken:侧栏上移/下移/回自动/手排↺(useGroupOrders→onChanged→
156+ // NotesPage refreshToken++)只经父层令牌通知——挂载单拉会在树面残留旧组序/
157+ // 复位后残留已删序行(审查 P2-10);与父层 refreshAll 同频重载,零去抖必要
158+ // (重载=读操作,量级毫秒级;本组件自持的保存路径 saveOrder 仍内联 loadOrders)
151159 const loadOrders = useCallback ( ( ) => {
152160 invoke < [ string , number , number ] [ ] > ( "note_order_list" )
153161 . then ( ( rows ) => {
@@ -162,7 +170,7 @@ export default function NoteListView({
162170 . then ( ( rows ) => setGroupOrderRows ( new Map ( rows . map ( ( [ gid , seq ] ) => [ gid , seq ] ) ) ) )
163171 . catch ( ( e ) => console . warn ( "[notes] 组排序读取失败(自动排序兜底):" , e ) ) ;
164172 } , [ ] ) ;
165- useEffect ( ( ) => { loadOrders ( ) ; } , [ loadOrders ] ) ;
173+ useEffect ( ( ) => { loadOrders ( ) ; } , [ loadOrders , refreshToken ] ) ;
166174
167175 const saveOrder = useCallback ( async ( scope : string , ids : number [ ] ) => {
168176 await invoke ( "note_order_save" , { scope, noteIds : ids } ) ;
0 commit comments