UNPKG

synapse-storage

Version:

Набор инструментов для управления состоянием и апи-запросами

36 lines (35 loc) 2.16 kB
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 {};