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

@triggery/mobx

Читай observable-состояние MobX из условия Triggery, не задействуя dependency tracking MobX на хост-компоненте. Никаких autorun, reaction, observer — просто обычная функция read, вызываемая в момент срабатывания.

npm bundle

pnpm add @triggery/core @triggery/react @triggery/mobx mobx

Peer-зависимости: react >= 18.0.0, mobx ^6.

ЭкспортНазначение
useMobxCondition(trigger, name, read)Регистрирует условие на основе обычной read-функции над MobX-состоянием.
import { makeAutoObservable } from 'mobx';
import { createTrigger } from '@triggery/core';
import { useMobxCondition } from '@triggery/mobx';

class SettingsStore {
  sound = true;
  notifications = true;
  constructor() { makeAutoObservable(this); }
}

const settings = new SettingsStore();

const messageTrigger = createTrigger<{
  events: { 'new-message': { text: string } };
  conditions: { settings: { sound: boolean; notifications: boolean } };
  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() {
  useMobxCondition(messageTrigger, 'settings', () => ({
    sound:         settings.sound,
    notifications: settings.notifications,
  }));
  return null;
}

Функция read вызывается только при срабатывании триггера. Dependency tracking MobX из хука не задействуется, поэтому:

  • Никаких ререндеров компонентов из-за этого хука.
  • Никакой подписчик не остаётся в живых между срабатываниями.

Если компоненты тоже должны рендерить observable — заворачивай их в observer (или используй useObserver из mobx-react-lite) — оба пути ортогональны.

useMobxCondition<S, K>(
  trigger: Trigger<S>,
  name: K,
  read: () => ConditionMap<S>[K],
): void

read — обычная функция. Используй .get() для боксов, точечный доступ к observable.object и т.д. — ровно так же, как читаешь MobX-состояние в любом другом месте.