Узлы состояния¶
Конечный автомат содержит узлы состояний (state nodes), которые в совокупности описывают общее состояние (state), в котором может находиться автомат. В автомате fetchMachine
, описанном в следующем разделе, есть узлы состояний, такие как:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
И общее состояние (state), которое является возвращаемым значением функции machine.transition()
или значением обратного вызова service.onTransition()
:
1 2 3 4 5 6 7 8 9 |
|
Что такое узлы состояния?¶
В XState узел состояния (state node) определяет конфигурацию состояния. Они определены в свойстве state
автомата. Точно так же узлы подсостояния иерархически определены в свойстве states
узла состояния.
Состояние, определенное из machine.transition(state, event)
, представляет собой комбинацию узлов состояния. Например, в автомате ниже есть узел состояния success
и узел подсостояния items
. Значение состояния {success: 'items'}
представляет комбинацию этих узлов состояния.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
Типы узлов состояния¶
Есть пять различных типов узлов состояния:
- Узел атомарного (atomic) состояния не имеет дочерних состояний.
- Узел составного (compound) состояния содержит одно или несколько дочерних состояний и имеет начальное состояние, которое является ключом одного из этих дочерних состояний.
- Узел параллельного (parallel) состояния содержит два или более дочерних состояния и не имеет начального состояния, так как он представляет нахождение во всех своих дочерних состояниях одновременно.
- Узел конечного (final) состояния — это конечный узел, который представляет абстрактное «конечное» состояние.
- Узел состояния истории (history) — это абстрактный узел, который представляет преобразование в самое последнее мелкое или глубокое состояние истории своего родительского узла.
Тип узла состояния может быть явно определен на узле состояния:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
|
Явное указание type
как 'atomic'
, 'compound'
, 'parallel'
, 'history'
или 'final'
полезно для анализа и проверки типов в TypeScript. Однако это требуется только для параллельного, исторического и конечного состояний.
Узлы проходного состояния¶
Узел проходного состояния (transient state node) — это "проходной" узел состояния, который немедленно переходит к другому узлу состояния; то есть автомат не остается в проходном состоянии. Узлы проходного состояния полезны для определения того, в какое состояние автомат должен действительно перейти из предыдущего состояния на основе условий. Они больше всего похожи на псевдосостояния выбора в UML.
Лучший способ определить узел проходного состояния — это бессобытийное состояние (eventless state) и постоянный переход always
. Это переход, при котором немедленно выполняется первое условие, которое оценивается как истинное.
Например, начальное переходное состояние этого автомата преобразуется в 'morning'
, 'afternoon'
или 'evening'
, в зависимости от того, какое сейчас время (детали реализации скрыты):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
Метаданные узла состояния¶
Мета-данные, которые представляют собой статические данные, описывающие соответствующие свойства любого узла состояния, могут быть указаны в свойстве .meta
узла состояния:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
|
Текущее состояние машины собирает .meta
-данные всех узлов состояния, представленных значением состояния, и помещает их в объект, где:
- Ключи — это идентификаторы узлов состояния.
- Значения — это значения мета-узла состояния
.meta
.
Теги¶
Узлы состояния могут иметь теги (tags), которые представляют собой строковые термины, помогающие описать узел состояния. Теги - это метаданные, которые могут быть полезны при классификации узлов различных состояний. Например, вы можете указать, какие узлы состояния представляют состояния, в которых данные загружаются, с помощью тега "loading"
и определить, содержит ли состояние эти тегированные узлы состояния с помощью state.hasTag(tag)
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|