49+ ✔ | 18+ ✔ | 18+ ✔ | 36+ ✔ | 10+ ✔ |
В IE может работать с использованием полифила @tetragius/raxy-polyfill
Простой менеджер состояний, для реализации подхода SSOT, может применяться c React или Vue
Работает на основе Proxy API, во всех поддерживающих его браузерах.
Основное отличие от большинства менеджеров состояний - работа с хранилищем, как с обычным объектом, без использования сложных механизмов событий и селекторов.
Поддерживает отладку Redux dev-tools
Оглавление:
npm install --save @tetragius/raxy
npm install --save @tetragius/raxy-react
npm install --save @tetragius/raxy @tetragius/raxy-vue
- React
- Vue
raxy(initState)
Возвращает объект с полями:
store
- проксированное хранилищеtransaction
- метод для проведения транзакцийsubscribe
- метод для подписки на события изменения хранилища (update
,transactionstart
,transactionend
)unsubscribe
- метод отмены подписки на события обновления хранилищаtransactions
- очередь транзакций
Каждая транзакция в очереди имеет метод abort
, который прерывает транзакцию и переходит к следующей.
transaction<Store>(name: string, async (store: Store, progress: (n: number) => void)) => boolean
Создает транзакцию для изменения нескольких значений хранилища, в случае если транзакция не успешна (если функция возвращает false
) - все действия будут отменены.
Транзакции ставятся в очередь и выполняются строго в порядке вызова.
Транзакции являются Promise
-функциями и могут быть объединены в цепочку.
transaction('transaction A', updater_A).then(transaction('transaction B', updater_B));
// или
await transaction('transaction A', updater_A);
await transaction('transaction B', updater_B);
Успешно выполненная транзакция возвращает - true
.
Имя транзакции носит чисто информативный характер и может быть выбрано на усмотрение разработчика.
Метод progress
- принимает число и задает прогресс выполнения, также вызывает событие transactionprogress
Метод progress
содержит:
- поле
progress.target
с типомITransaction
- поле
progress.prev
с типомITransaction
- результат предыдущей транзакции
interface ITransaction<S> {
name: string; // имя транзакции
pending: boolean; // статус выполнения
aborted?: any; // причина прерывания
progress: number; // этап выполнения
rollback: Rollback[]; // массив обратных операций
store: S; // ссылка на хранилище
updater: Updater<S>; // метод обновления хранилища
resolve?: Resolver<S> // массив обратных операций
abort: Abort; // метод для завершения транзакции - завпускает процедуру отката
}
export interface IDetail<S> {
name?: string;
complete?: string;
store: S;
}
subscribe(on: 'update'|'transactionstart'|'transactionend'|'addtransaction'|'transactionaborted'|'transactionprogress'|'connected', (event: CustomEvent<IDetail>) => void)
Подписывается или отменяет подписку на обновление хранилища.
Объект event
содержит поле detail
интерфейса IDetail
.
update
- Любое обновление хранилища.transactionstart
- Транзакция начата.transactionend
- Транзакция завершена.addtransaction
- Транзакция добавлена в очередьtransactionaborted
- Транзакция отмененаtransactionprogress
- Прогресс выполнения транзакцииconnected
- К хранилищу подключен новый объект
Для transactionstart
и transactionend
задаются дополнительно поля:
name
- имя транзакцииcomplete
- статус транзакции (true
- завершена)
Для transactionaborted
задаются дополнительно поля:
aborted
- {status: any} - объект описывающий причину отмены
Для transactionaborted
задаются дополнительно поля:
progress
- Процент выполнения, задается пользователем - тип число
Для connected
задаются дополнительно поля:
value
- Ссылка на новое подключенное хранилище
connect: <Store = any, State = any>(instanse: IRaxy<Store>, updateCallback: (state: State) => void, filter?: Filter<Store, State>, options?: IConnectorOptions<any> & Options<State>) => IConnector<Store, State>;
type Connector<S> = <State = any>(updateCallback: (state: State) => void, filter?: Filter<S, State>, options?: IConnectorOptions & Options<State>) => IConnector<S, State>;
Создает подключение к хранилищу
instanse
- экземпляр созданный вызовом методаraxy
updateCallback
- функция которая будет вызываться каждый раз при изменении состоянияfilter
- функция которая определяет при изменении каких частей хранилища вызыватьupdateCallback
options
- набор опций для оптимизации работы
type Options<State = any> = {
[P in keyof State]?: {
ignoreTimeStamp?: boolean;
};
};
interface IConnectorOptions<T = any> {
elementRef?: RefObj<T>;
}
Пример опций
connect(
(store) => ({
todos: store.todos, /
length: store.todos.length
}),
{
todos: { ignoreTimeStamp: true } // рендер не учитывает изменения состояния дочерних элеиентов
elementRef: element // ссылка на DOM ноду для оптимизации вызова updateCallback
}
);
При указании elementRef
- автоматически отключает проверку изменния состояния хранилища, если указанный элемент не виден на странице или в любом вьюпорте.
Метод connect
возвращает объект с полями
state
- ссылка на состояние возвращаемое методомfilter
store
- ссылка наstore
transaction
- метод для осуществления транзакцийmountCallback
- метод который следует вызвать для включения подпискиunmountCallback
- метод который следует вызвать для отключения подписки
createConnector: <Store = any>(initStore: Store) => IRaxyWithConnector<Store>;
interface IRaxyWithConnector<S> extends IRaxy<S> {
connect: Connector<S>;
}
Создает типизированный экземпляр функции connect
может быть использован вместо вызова raxy
logger: (subscribe: IRaxy<any>['subscribe']) => void;
Выводит в консоль лог событий update
, transactionstart
, transactionend
, addtransaction
, transactionaborted
, transactionprogress
, connected
;
connectDevTools: (instanse: IRaxy<any>) => void;
Активирует поддержку Redux dev-tools
// Добавьте в начало первого файла в сборке
import "@babel/polyfill";
import '@tetragius/raxy-polyfill';
В IE есть ряд ограничений
- Не корректно работают мутации - изменения должны быть имутабельны
- Надо подписываться на изменяемое свойство, так как не работает подписка на оюъект