react-di-container
v1.0.416
Published
A simple dependency injection container for React applications
Downloads
18
Maintainers
Readme
Контроллеры
Если компонент реализуют в себе сложную логику, эту логику необходимо вынести на уровень контроллера. Это позволит разбить общее полотно кода на часть визуализации и часть с логикой (*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)
}