различные кэши
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
import { IMyRequest } from './models/IMyRequest';
|
||||
|
||||
// Загруженная страница таблицы — то, что кладётся в кеш вкладки
|
||||
// (см. RequestsTableView/SearchView).
|
||||
export interface IPage {
|
||||
rows: IMyRequest[];
|
||||
totalRows: number;
|
||||
}
|
||||
|
||||
// Хранилище на уровне МОДУЛЯ, а не внутри компонента (useRef), потому что
|
||||
// компоненты таблиц размонтируются при переключении разделов: RequestPortal
|
||||
// рендерит либо SubmitFeature, либо SearchView, либо RequestsTableView — уход
|
||||
// на «Поиск» или «Новая заявка» уничтожает экземпляр таблицы вместе со всем его
|
||||
// состоянием. С useRef кеш переживал только переключение «Мои заявки» ↔ «На
|
||||
// согласовании» (там экземпляр один, меняется лишь проп kind), а после захода
|
||||
// на «Поиск» терялся. Здесь он живёт до перезагрузки страницы.
|
||||
//
|
||||
// Ключ формирует вызывающая сторона и обязательно начинает с префикса раздела
|
||||
// (см. pageKey), иначе ключи двух таблиц пересеклись бы.
|
||||
const store = new Map<string, IPage>();
|
||||
|
||||
// Ключ кеша: раздел + всё, от чего зависит содержимое страницы.
|
||||
export function pageKey(view: string, parts: Array<string | number>): string {
|
||||
return [view, ...parts].join('|');
|
||||
}
|
||||
|
||||
export function readPage(key: string): IPage | undefined {
|
||||
return store.get(key);
|
||||
}
|
||||
|
||||
export function writePage(key: string, page: IPage): void {
|
||||
store.set(key, page);
|
||||
}
|
||||
|
||||
// Слепок страницы для сравнения «изменилось ли что-нибудь». Сравниваем поля,
|
||||
// которые видны в таблице: если они совпали, перерисовывать нечего — иначе при
|
||||
// каждом возврате на вкладку и при каждом фоновом обновлении таблица моргала бы,
|
||||
// перерисовываясь тем же самым содержимым.
|
||||
export function pageSignature(page: IPage): string {
|
||||
return `${page.totalRows}|${page.rows
|
||||
.map((r) => [r.requestTypeId, r.id, r.title, r.status, r.created, r.authorName].join('~'))
|
||||
.join(';')}`;
|
||||
}
|
||||
Reference in New Issue
Block a user