Обработка событий без перехода
Самопереходы в lite-fsm обрабатывают события без изменения текущего состояния автомата. Используйте их для обновления контекста и обработки событий, которые не должны менять текущий режим работы.
Примеры reducer-ов на этой странице написаны в стиле Immer: они мутируют draft
stateи предполагают, чтоMachineManagerсоздан сimmerMiddleware. Без middleware reducer должен вернуть новый объект{ state, context }.
Концепция self-переходов
В стандартной модели конечных автоматов событие обычно вызывает переход из одного состояния в другое. Однако существуют ситуации, когда нужно обработать событие, не меняя текущее состояние. Для этого в lite-fsm используются null-переходы, которые обозначаются значением null в конфигурации автомата.
Определение self-переходов
Self-переходы определяются в конфигурации автомата путем указания null в качестве целевого состояния:
import { createMachine } from "@lite-fsm/core";
export const player = createMachine({
config: {
IDLE: {
START_PLAYBACK: null, // Событие обрабатывается, но состояние не меняется
},
},
initialState: "IDLE",
initialContext: {
started: false,
},
reducer: (state, action, { nextState }) => {
state.state = nextState;
if (action.type === "START_PLAYBACK") {
state.context.started = true;
}
},
});Лучшие практики использования self-переходов
- Используйте для обновления контекста: self-переходы подходят для изменений данных без смены режима.
- Опирайтесь на
nextState: при self-переходеMachineManagerпередаёт в reducer текущее состояние вместоnull. - Не прячьте сложный процесс: если обработка события стала ветвистой, выделите отдельное состояние.
- Учитывайте effects: при self-переходах effects для конкретных состояний не вызываются, потому что состояние не меняется. Для таких событий используйте effect с ключом
"*".