События
Событие сообщает модели, что что-то произошло. Оно не хранит состояние и не решает, что делать дальше. Его задача — принести payload в граф и дать реакциям возможность отреагировать.
const queryChanged = event<string>();
const submitted = event<void>();Хорошее событие обычно называет факт или доменное намерение. Факт звучит как то, что уже произошло: queryChanged, submitted, messageReceived, routeOpened. Намерение полезно, когда модель открывает наружу маленькую команду, например open, close или submit в модели модального окна. Избегать стоит не повелительного наклонения само по себе, а технических setter-имен вроде setQuery и updateState: они привязывают модель к способу изменения, а не к смыслу действия.
Изменение состояния
Событие само ничего не меняет. Состояние меняется в реакции.
reaction({
on: queryChanged,
run(text) {
query.value = text;
},
});На одно событие могут реагировать несколько правил. Например, submitted может запустить эффект поиска, сбросить ошибку и записать время последней отправки. Событие при этом остается маленьким и понятным.
Payload
Payload — данные события. Для queryChanged это новый текст. Для messageReceived это сообщение. Для submitted payload может быть не нужен, поэтому используется event<void>().
Не кладите в payload больше, чем нужно правилу. Если реакция может прочитать актуальное значение из стора, часто лучше прочитать его там, а не тащить через событие лишние данные.