@triggery/redux
Читай Redux-стор из условия Triggery без подписки компонента на ререндеры. Работает с обычным Redux и @reduxjs/toolkit — хук вызывает store.getState() только в момент срабатывания.
Установка
Заголовок раздела «Установка»pnpm add @triggery/core @triggery/react @triggery/redux redux npm install @triggery/core @triggery/react @triggery/redux redux yarn add @triggery/core @triggery/react @triggery/redux redux bun add @triggery/core @triggery/react @triggery/redux redux Peer-зависимости: react >= 18.0.0, redux ^4 || ^5. @reduxjs/toolkit реэкспортирует ту же форму Store и работает из коробки.
Что внутри
Заголовок раздела «Что внутри»| Экспорт | Назначение |
|---|---|
useReduxCondition(trigger, name, store, selector) | Регистрирует условие, читающее Redux. Компонент не подписывается на стор. |
Быстрый пример
Заголовок раздела «Быстрый пример»import { configureStore } from '@reduxjs/toolkit';
import { createTrigger } from '@triggery/core';
import { useReduxCondition } from '@triggery/redux';
import { rootReducer } from './rootReducer';
const store = configureStore({ reducer: rootReducer });
type State = ReturnType<typeof store.getState>;
type Settings = State['settings'];
const messageTrigger = createTrigger<{
events: { 'new-message': { text: string } };
conditions: { settings: Settings };
actions: { showToast: { body: string } };
}>({
id: 'message-received',
events: ['new-message'],
required: ['settings'],
handler({ event, conditions, actions }) {
if (!conditions.settings.notifications) return;
actions.showToast?.({ body: event.payload.text });
},
});
function SettingsBridge() {
useReduxCondition(messageTrigger, 'settings', store, (s) => s.settings);
return null;
}Как это работает
Заголовок раздела «Как это работает»Triggery — pull-only: селектор вызывается только при срабатывании триггера, а не на каждый dispatch. Хук не подписывает компонент на стор — диспатчи никогда не ререндерят bridge-компонент. Если отдельному компоненту нужен тот же срез в JSX — рядом используй useSelector из react-redux.
useReduxCondition<T, S, K>(
trigger: Trigger<S>,
name: K,
store: { getState(): T },
selector: (state: T) => ConditionMap<S>[K],
): voidСвязанные пакеты
Заголовок раздела «Связанные пакеты» @triggery/core Экспортирует Trigger.
@triggery/react useReduxCondition — это React-хук.
@triggery/zustand Альтернативный адаптер для Zustand-сторов.
@triggery/jotai Альтернативный адаптер для Jotai-атомов.
@triggery/codemod migrate-from-listener-middleware переносит эффекты RTK в триггеры.