perf(web): 优化大数据量页面切换与聚合性能

This commit is contained in:
Script Generator
2026-07-03 09:43:36 +08:00
parent 554ab520d1
commit a509bb4922
32 changed files with 1087 additions and 360 deletions

View File

@@ -1,12 +1,14 @@
'use client';
import { create } from 'zustand';
import type { TaskWorklog } from '@/lib/task-worklog';
import { loadServerData, saveServerData } from '@/lib/server-data';
import { loadServerData, saveServerData, SERVER_DATA_CACHE_MS } from '@/lib/server-data';
function saveStored(items: TaskWorklog[]) {
saveServerData('task-worklogs', items).catch(() => {});
}
let lastWorklogsFetchAt = 0;
async function loadStored(): Promise<TaskWorklog[] | null> {
try {
return await loadServerData<TaskWorklog[]>('task-worklogs');
@@ -16,7 +18,8 @@ async function loadStored(): Promise<TaskWorklog[] | null> {
interface TaskWorklogState {
worklogs: TaskWorklog[];
fetchWorklogs: () => Promise<void>;
loaded: boolean;
fetchWorklogs: (options?: { force?: boolean }) => Promise<void>;
addWorklog: (data: Omit<TaskWorklog, 'id' | 'createdAt'>) => void;
deleteWorklog: (id: string) => void;
getActualHours: (taskId: string) => number;
@@ -24,10 +27,14 @@ interface TaskWorklogState {
export const useTaskWorklogStore = create<TaskWorklogState>((set, get) => ({
worklogs: [],
loaded: false,
fetchWorklogs: async () => {
fetchWorklogs: async (options) => {
if (!options?.force && get().loaded && Date.now() - lastWorklogsFetchAt < SERVER_DATA_CACHE_MS) return;
const cached = await loadStored();
if (cached) set({ worklogs: cached });
if (!options?.force && get().loaded && Date.now() - lastWorklogsFetchAt < SERVER_DATA_CACHE_MS) return;
lastWorklogsFetchAt = Date.now();
set({ worklogs: cached ?? [], loaded: true });
},
addWorklog: (data) => {
@@ -37,13 +44,13 @@ export const useTaskWorklogStore = create<TaskWorklogState>((set, get) => ({
createdAt: new Date().toISOString(),
};
const updated = [...get().worklogs, item];
set({ worklogs: updated });
set({ worklogs: updated, loaded: true });
saveStored(updated);
},
deleteWorklog: (id) => {
const updated = get().worklogs.filter((w) => w.id !== id);
set({ worklogs: updated });
set({ worklogs: updated, loaded: true });
saveStored(updated);
},