useCondition
Стабильный · с 0.1.0
Регистрирует pull-only геттер условия на триггере. Рантайм вызывает getter() только в момент зажигания — никаких подписок нет, и компонент не ререндерится, когда триггер срабатывает.
deps работает как у useMemo: при изменении любого элемента рантайм видит обновлённое замыкание.
import { useCondition } from '@triggery/react';
Сигнатура
Заголовок раздела «Сигнатура»function useCondition<S extends TriggerSchema, K extends ConditionKey<S>>(
trigger: Trigger<S>,
name: K,
getter: () => ConditionMap<S>[K],
deps?: readonly unknown[],
): void;Параметры
Заголовок раздела «Параметры»| Параметр | Тип | Описание |
|---|---|---|
trigger | Trigger<S> | Триггер, возвращённый из createTrigger. |
name | K extends ConditionKey<S> | Условие, объявленное в схеме триггера. |
getter | () => ConditionMap<S>[K] | Синхронная функция, возвращающая текущее значение. |
deps | readonly unknown[] (по умолчанию []) | Та же семантика, что и у useMemo — при изменении любого элемента захваченное замыкание обновляется. |
Возвращает
Заголовок раздела «Возвращает»void. Регистрация выполняется в useEffect и зачищается на размонтировании.
Примеры
Заголовок раздела «Примеры»Базовый провайдер
Заголовок раздела «Базовый провайдер»import { createTrigger } from '@triggery/core';
import { useCondition } from '@triggery/react';
import { useState } from 'react';
const trigger = createTrigger<{
events: { ping: void };
conditions: { user: { id: string; name: string } | null };
}>({
id: 'demo',
events: ['ping'],
required: ['user'],
handler({ conditions }) {
if (!conditions.user) return;
console.log('user', conditions.user.name);
},
});
function UserProvider() {
const [user, setUser] = useState<{ id: string; name: string } | null>(null);
useCondition(trigger, 'user', () => user, [user]);
return null;
}Без deps (стабильный геттер)
Заголовок раздела «Без deps (стабильный геттер)»Если твой геттер читает из ref или модульной переменной, deps не нужен:
import { useCondition } from '@triggery/react';
import { trigger } from './x.trigger';
const settingsRef = { current: { sound: true } };
function StableProvider() {
useCondition(trigger, 'settings', () => settingsRef.current);
}Из внешнего стора (пример с Zustand)
Заголовок раздела «Из внешнего стора (пример с Zustand)»import { useCondition } from '@triggery/react';
import { useStore } from 'zustand';
import { settingsStore } from './stores/settings';
import { trigger } from './x.trigger';
function Provider() {
const settings = useStore(settingsStore);
useCondition(trigger, 'settings', () => settings, [settings]);
}Для zero-rerender-адаптера, обходящего путь через React state, используй @triggery/zustand.
Замечания
Заголовок раздела «Замечания»См. также
Заголовок раздела «См. также» useEvent Зажигать события из продюсеров.
useAction Зарегистрировать обработчик действия.
Руководство по условиям Полный нарратив о pull-only, снепшотах и владении.
@triggery/zustand Использовать Zustand-стор как условие без ререндеров.