Перейти к содержимому
GitHubXDiscord

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;
ПараметрТипОписание
triggerTrigger<S>Триггер, возвращённый из createTrigger.
nameK extends ConditionKey<S>Условие, объявленное в схеме триггера.
getter() => ConditionMap<S>[K]Синхронная функция, возвращающая текущее значение.
depsreadonly 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;
}

Если твой геттер читает из ref или модульной переменной, deps не нужен:

import { useCondition } from '@triggery/react';
import { trigger } from './x.trigger';

const settingsRef = { current: { sound: true } };

function StableProvider() {
  useCondition(trigger, 'settings', () => settingsRef.current);
}
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.