1.0.61 • Published 9 months ago
react-di-container v1.0.61
Контроллеры
Если компонент реализуют в себе сложную логику, эту логику необходимо вынести на уровень контроллера. Это позволит разбить общее полотно кода на часть визуализации и часть с логикой (*VC-подход).
Для работы с контроллерами в утилитах есть функционал:
- хок
withIsolatedScopeпозволяет создать новый скоуп - хук
useCreateScopedпри маунте компонента создает контроллер и удаляет его при анмаунте - хук
useScopedпозволяет получить созданный ранее контроллер из текущего скоупа - хук
useCreateTransientработает аналогичноuseCreateScoped, но не добавляет созданный контроллер в скоуп
Контроллеры должны наследоваться от BaseController. У базового класса контроллера существует несколько необходимых для этого методов:
onCreate,onDestroy- колбеки, которые вызываются соответственно сразу после добавления и прямо перед удалением подконтроллера- методы
addSubControllerиaddSubControllers- создает дочерние контроллеры и добавляет в скоуп - метод
removeSubController- удаляет дочерний контроллер из скоупа - метод
getScoped- получает созданный ранее контроллер из скоупа - метод
hasScoped- позволяет узнать существует ли контроллер в текущем скоупе
Внутри одного скоупа невозможно дважды создать один контроллер. Для обхода этого ограничения в зависимости от конкретного кейса можно использовать withIsolatedScope или useCreateTransient
Инициализация
const GlobalsRef: ObjectRef<TGlobals> = window
export async function initGlobals() {
const services = new ServicesManager()
const stores = new StoresManager()
setGlobal(GlobalsRef, { stores, services })
return { stores, services }
}
export function getGlobals() {
return getGlobal(GlobalsRef)
}
export function getService<T extends TServicesKeys>(serviceName: T): TServices[T] {
return getGlobals().services.getService(serviceName)
}
export function getStore<T extends TStoresKeys>(storeName: T): TStores[T] {
return getGlobals().stores.getStore(storeName)
}