synapse-storage
Version:
Набор инструментов для управления состоянием и апи-запросами
36 lines (35 loc) • 2.16 kB
TypeScript
import type { SelectorAPI } from '../../core';
interface UseSelectorOptions<T> {
/** Функция сравнения для предотвращения лишних ререндеров */
equals?: (a: T, b: T) => boolean;
/** Включать ли статус загрузки в возвращаемый результат */
withLoading?: boolean;
}
/**
* Хук для использования селекторов в компонентах React.
* Использует useSyncExternalStore для корректной работы в Concurrent Mode.
* Подписывается напрямую через selector.subscribe() — без глобального реестра.
*/
export declare function useSelector<T>(selector: SelectorAPI<T>): T;
export declare function useSelector<T>(selector: SelectorAPI<T>, options: UseSelectorOptions<T> & {
withLoading: true;
}): {
data: T;
isLoading: boolean;
};
export declare function useSelector<T>(selector: SelectorAPI<T>, options: UseSelectorOptions<T> & {
withLoading?: false;
}): T;
/**
* Изоляция ре-рендеров для keyed-map стора (паттерн «equals»). Подписка идёт на
* ВЕСЬ map (`selector`), но `equals` сравнивает только срез по `key` → компонент
* ре-рендерится лишь когда меняется его `map[key]` по ссылке. Работает, т.к.
* иммутабельные мутации по одному ключу не трогают ссылку чужих срезов.
* Гранулярность живёт в месте вызова, а селекторы остаются плоскими (без фабрик
* с `Map<key, selector>`).
*
* `fallback` ОБЯЗАН быть стабильной ссылкой (module-level константа), иначе
* `?? fallback` будет давать новый объект каждый тик и рвать нижестоящие `useMemo`.
*/
export declare function useKeyedSliceSelector<V>(selector: SelectorAPI<Record<string, V>>, key: string, fallback: V): V;
export {};