Можно ли с помощью xstate настроить событие, применимое во всех состояниях и одинаково обрабатываемое во всех состояниях и подсостояниях?

Я новичок в xstate, и я пытаюсь использовать его в приложении, где пользователь может запрашивать разные вещи в приложении на основе родительского состояния и/или подсостояния. Однако есть некоторые запросы, которые пользователь должен иметь возможность делать независимо от того, в каком состоянии/подсостоянии находится приложение. Реакция на эти события одинакова, независимо от предыдущего состояния. Как я могу настроить это событие, чтобы мне не приходилось повторять его определение во всех состояниях/подсостояниях?


person curiousWebDev    schedule 23.04.2020    source источник


Ответы (1)


Да — алгоритм выбора переходов аналогичен распространению событий DOM в том смысле, что он ищет от листовых узлов к корневому узлу.

Вы можете определить переходы на корневом узле (верхний уровень), которые будут обрабатываться в любом состоянии естественным образом:

import { createMachine } from 'xstate';

const machine = createMachine({
  // ...

  // top-level transitions
  on: {
    ESC: {/* ... */}
  },
  states: {
    // ...
    someState: {
      on: {
        ESC: {/* override top-level transition */}
      }
    }
  }
});
person David Khourshid    schedule 24.04.2020
comment
О, это прекрасно, именно то, что мне нужно! - person curiousWebDev; 24.04.2020
comment
извините за оффтоп, я ищу противоположное поведение, в словах DOM - всплытие события до корневого узла (и выполнение действий во всех состояниях, где событие определено). это возможно с xstate? - person Valentin Kantor; 19.07.2021
comment
@ValentinKantor Это невозможно с алгоритмом (который следует алгоритму SCXML). - person David Khourshid; 21.07.2021