Управление состоянием - Effector
Привет, на связи Antihype JS. Продолжаем цикл статей по разбору стейт менеджеров. Сегодня у нас на обзоре наделавший шуму в сообществе Effector.js.
В отличие от других подобных библиотек, команда Effector позиционирует свое решение не как стейт менеджер, а как инструмент для описания бизнес-логики приложения.
Effector предлагает возможность описать бизнес-логику на том же языке, на котором общается команда разработчиков продукта, используя базовые примитивы: Event, Store, Effect.
Effector построен вокруг концепции связи между атомарными сторами и событиями, использует иммутабельный подход к данным и имеет хорошую поддержку TypeScript.
Примитивы Effector
Store - основной объект для хранения данных. Рекомендуется декомпозировать ваши данные на большое количество сторов и связывать при необходимости. По конвенции имена всех сторов начинаются с $.
Event - способ сообщить о каком-либо событии в приложении или просто изменить состояние стора. При срабатывании запускает каскад последующих вычислений в приложении.
Effect - контейнер для всевозможных сайд-эффектов. Как правило эффекты используются для асинхронных операций. Эффект имеет встроенные события успешного завершения, ошибки, а также индикатор того что эффект находится в процессе выполнения. В качестве первого аргумента принимает обычную функцию:
Связи между примитивами и написание логики
Мы разобрали необходимые примитивы для работы с Effector. Давайте напишем небольшой пример программы, которая будет отправлять состояние счетчика на сервер, когда его значение будет равно 5.
Для начала создадим стор для нашего счетчика и событие инкремента:
Чтобы изменить состояние стора по событию мы будем использовать метод on. Для логирования состояния в консоль будем использовать метод watch:
Метод on принимает событие и функцию для обновления состояния. При срабатывании события inc:
- Запускается функция для обновления стейта с предыдущим значением стора.
- После обновления состояния стора срабатывает метод watch, происходит вывод текущего значения стейта в консоль.
Теперь добавим эффект сохранения состояния счетчика на базе фейковой функции. Логируем приходящий аргумент и резолвим промис через 500 миллисекунд для имитации выполнения запроса:
Осталось добавить ключевой элемент всей библиотеки - оператор sample. Этот метод позволяет запускать какую-либо логику при срабатывании событий. В нашем случае, нам необходимо запустить эффект при состоянии счетчика равном 5:
В качестве источника данных source используется наш стор $counter. В качестве сущности для последующего запуска target используется эффект saveCountFx. Для соблюдения условия запуска используется свойство filter. В filter передается функция, которая получает текущее значение source. Такую запись можно перефразировать следующим образом:
Когда $counter обновит состояние, то проверить, что его значение равно 5. Если условие выполняется, то запустить saveCountFx со значением из $counter.
Также с помощью sample можно задать событие clock, по которому следует запускать нашу логику:
Когда событие buttonClicked будет вызвано, то проверить что значение $counter равно 5. Если условие выполняется, то запустить saveCountFx со значением из $counter.
Наша задача с сохранением значения счетчика будет выглядеть следующим образом:
Мы добавили вызов события инкремента 5 раз, подписки на события выполнения и индикатор выполнения операции. Результат в консоли:
Тестирование, SSR, экосистема
- Полный гайд от сообщества по тестированию с Effector
- Пакет для SSR на Next.js
- Репозиторий с дополнительными пакетами для Effector от сообщества: формы, eslint плагины, библиотеки утилит
Заключение
Мы сделали обзор на основные концепции и работу с библиотекой Effector. Использовать его в проде или нет - как обычно, решать только вам. Важно отметить, что Effector имеет большое русскоязычное сообщество.
Если вам понравился контент и вы интересуетесь фронтенд-разработкой, то подписывайтесь на наш телеграм-канал.
Братан, хорош, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще?
Братан, хорош
Братан, хорош, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще?