@triggery/zustand
Читай Zustand-стор из условия Triggery. Pull-only — селектор вызывается в момент срабатывания, а не на каждое обновление стора, поэтому хост-компонент никогда не ререндерится из-за этого хука.
Установка
Заголовок раздела «Установка»pnpm add @triggery/core @triggery/react @triggery/zustand zustand npm install @triggery/core @triggery/react @triggery/zustand zustand yarn add @triggery/core @triggery/react @triggery/zustand zustand bun add @triggery/core @triggery/react @triggery/zustand zustand Peer-зависимости: react >= 18.0.0, zustand ^4 || ^5.
Что внутри
Заголовок раздела «Что внутри»| Экспорт | Назначение |
|---|---|
useZustandCondition(trigger, name, store, selector) | Регистрирует условие, читающее Zustand. Работает и со сторами на create (хук), и на createStore (vanilla). |
Быстрый пример
Заголовок раздела «Быстрый пример»import { create } from 'zustand';
import { createTrigger } from '@triggery/core';
import { useZustandCondition } from '@triggery/zustand';
type Settings = { sound: boolean; notifications: boolean };
const useSettings = create<Settings>(() => ({
sound: true,
notifications: true,
}));
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() {
useZustandCondition(messageTrigger, 'settings', useSettings, (s) => s);
return null;
}Как это работает
Заголовок раздела «Как это работает»Рантайм pull-only: selector(store.getState()) вызывается только при срабатывании триггера, а не при изменении стора. То есть:
- Ничего в React-дереве не ререндерится из-за этого хука. Если компоненту нужен тот же срез — рядом вызови собственный
useStore(store, selector)Zustand. - Триггер всегда видит актуальное состояние в момент срабатывания — без подписок и без риска устаревшего снимка.
useZustandCondition<T, S, K>(
trigger: Trigger<S>,
name: K,
store: { getState(): T },
selector: (state: T) => ConditionMap<S>[K],
): voidСвязанные пакеты
Заголовок раздела «Связанные пакеты» @triggery/core Экспортирует Trigger.
@triggery/react useZustandCondition — это React-хук.
@triggery/redux Альтернативный адаптер для Redux-сторов.
@triggery/jotai Альтернативный адаптер для Jotai-атомов.
@triggery/mobx Альтернативный адаптер для MobX-observable.