Вопрос проверяет понимание организации sample и подписок на события в Effector в контексте Feature-Sliced Design (FSD) для создания чистой архитектуры приложения.
Feature-Sliced Design (FSD) предполагает строгую иерархию слоев: shared, entities, features, widgets, pages, app. В Effector важно, чтобы события и сторы не создавали циклических зависимостей между слоями. Для этого используется sample, который позволяет декларативно связывать источники (source) с целью (target) без прямого импорта.
Допустим, в entities/user есть стор $user и событие fetchUserFx. В features/auth мы хотим при успешной авторизации обновить пользователя. Вместо прямого вызова fetchUserFx из features, мы используем sample:
// features/auth/model.ts
import { createEvent, sample } from 'effector';
import { $user, fetchUserFx } from 'entities/user';
export const loginFx = createEffect(async (data) => {
// логика авторизации
});
sample({
clock: loginFx.done,
target: fetchUserFx,
});
Здесь sample подписывается на успешное завершение loginFx и запускает fetchUserFx. Это сохраняет направление зависимости: features -> entities, а не наоборот.
Для отладки или побочных эффектов можно использовать watch, но в FSD рекомендуется избегать watch внутри бизнес-логики, так как это может привести к неявным связям. Лучше использовать sample для явных связей.
// Пример watch для логирования
import { $user } from 'entities/user';
$user.watch((user) => {
console.log('User updated:', user);
});
Использование sample в FSD помогает поддерживать чистую архитектуру, избегая циклических зависимостей и делая связи между модулями явными. Это упрощает рефакторинг и тестирование, особенно в больших проектах.
Уровень
Рейтинг:
4
Сложность:
6
Навыки
JavaScript
React
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию