Что такое Effector и как он используется?
Что проверяют
Понимаете ли вы модель, в которой состояние и логика живут вне компонентов. Effector спрашивают, чтобы услышать не список функций, а то, как вы описываете поток данных декларативно и чем это отличается от привычного подхода с редьюсерами и диспатчем.
Как отвечать
Три примитива: событие как точка входа, стор как значение, эффект как обёртка асинхронной функции. Связи между ними объявляются заранее, граф существует независимо от React, а компонент только подписывается на нужные юниты через useUnit.
const submit = createEvent<string>();
const searchFx = createEffect((q: string) => api.search(q));
const $items = createStore<Item[]>([]).on(searchFx.doneData, (_, res) => res);
const $pending = searchFx.pending;
sample({ clock: submit, filter: (q) => q.length > 2, target: searchFx });Ключевой оператор это sample: он связывает источник, момент срабатывания и получателя, умеет фильтровать и преобразовывать по дороге. Почти вся логика приложения выражается им, а не императивными подписками. Эффект бесплатно даёт pending, done и fail, поэтому ручные флаги загрузки не нужны.
Для серверного рендеринга важен fork: он создаёт изолированный scope, в котором состояние не утекает между запросами.
Где спотыкаются
Пишут императивно: читают значение стора вручную, ветвятся внутри обработчика в компоненте и зовут эффект по условию. Условие место в sample, иначе теряется главное преимущество, то есть логика, которую видно и можно тестировать без рендера.
Складывают побочные эффекты в watch. Это отладочный инструмент, а не способ связывания. Логика, спрятанная в подписках, не воспроизводится в тестах и выполняется в неочевидном порядке.
Забывают про scope на сервере и держат данные пользователя в модульном сторе. Модуль на сервере один на процесс, поэтому запрос одного посетителя подмешивается к ответу другому, и ловится это только под нагрузкой.