Event
Event (событие, ивент) это функция, на вызовы которой можно подписаться. Она может обозначать намерение изменить состояния в приложении, указанием на то, что происходит в приложении, быть командой для управления сущностями, триггером вычислений и так далее.
Event в документации.
Store
Store (состояние, стор) это объект который хранит состояние. В приложении могут совместно существовать множество состояний
Store в документации.
Effect
Effect это контейнер для сайд-эффектов, возможно асинхронных. В комплекте имеет ряд заранее созданных эвентов и сторов, облегчающих стандартные действия
При императивном вызове всегда возвращает Promise с результатом.
Может иметь один аргумент или не иметь ни одного
Effect в документации
Domain
Domain это способ группировки и применения массовых обработок к юнитам. Домены получают уведомления о создании событий, сторов, эффектов и вложенных доменов. Часто используются для логирования и SSR
Domain в документации
Unit
Тип данных, используемый для описания бизнес-логики приложений. Большинство методов эффектора имеют дело с обработкой юнитов. Существует пять типов юнитов: Store, Event, Effect, Domain и Scope
Common unit
Обычные юниты можно использовать для запуска обновлений других юнитов. Существует три типа обычных юнитов: Store (стор), Event (событие) и Effect (эффект). Когда метод принимает юниты, это означает, что он принимает события, эффекты и сторы в качестве источника реактивных обновлений
Purity
Большинство функций, передаваемых в методы api не должны вызывать другие события или эффекты: легче рассуждать о потоке данных приложения, когда императивные триггеры сгруппированы внутри обработчиков эффектов, а не рассредоточены по всей бизнес-логике
Правильно, императивно:
import { createStore, createEvent } from "effector";
const login = createStore("guest");
const loginSize = login.map((login) => login.length);
const submitLoginSize = createEvent();
loginSize.watch((size) => {
submitLoginSize(size);
});
store.map
в документации
store.watch
в документации
Правильно, декларативно:
import { createStore, createEvent, forward } from "effector";
const login = createStore("guest");
const loginSize = login.map((login) => login.length);
const submitLoginSize = createEvent();
forward({
from: loginSize,
to: submitLoginSize,
});
Неправильно:
import { createStore, createEvent, forward } from "effector";
const submitLoginSize = createEvent();
const login = createStore("guest");
const loginSize = login.map((login) => {
// лучше переместить этот вызов в watch или эффект
submitLoginSize(login.length);
return login.length;
});
Reducer
type StoreReducer<State, E> = (state: State, payload: E) => State | void;
type EventOrEffectReducer<T, E> = (state: T, payload: E) => T;
Reducer вычисляет новое состояние, учитывая предыдущее состояние и данные из события. Для сторов, если reducer возвращает undefined или то же состояние (===), то обновления не будет
Watcher
type Watcher<T> = (update: T) => any;
Watcher – функция с сайд-эффектами, для работы которых не нужны возможности по перехвату ошибок и уведомления подписчиков об завершении асинхронной работы. Используется в event.watch, store.watch и хуках домена. Возвращаемое значение игнорируется
Subscription
type Subscription = {
(): void;
unsubscribe(): void;
};
Функция отмены подписки, после её вызова watcher перестаёт получать обновления и удаляется из памяти. Повторные вызовы функции отмены подписки не делают ничего
Ручное управление подписками мешает сосредоточиться на управлении данными и бизнес-логикой
Эффектор предоставляет широкий набор возможностей, чтобы свести необходимость удаления подписок к минимуму. Это отличает его от большинства других реактивных библиотек
Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.