Процесс Тип
Графическое выражение
Мышление Тип
Структурированное выражение
Заметки Тип
Эффективное выражение

Диаграмма состоянийСинтаксис

Диаграмма состояний

Синтаксис диаграммы состояний Mermaid совместим с синтаксисом, используемым в plantUml, что упрощает пользователям обмен диаграммами между mermaid и plantUml.

Код
                            
Копировать
Встраивание
--- title: Simple sample --- stateDiagram-v2 [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*]

Старый редактор:

Код
                            
Копировать
Встраивание
stateDiagram [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*]

Новый редактор:

На диаграмме состояний система описывается через состояния и то, как одно состояние посредством перехода изменяется на другое. Пример диаграммы выше показывает три состояния: покой, движение и столкновение. Вы начинаете из состояния покоя, из состояния покоя можно перейти в состояние движения. Из состояния движения вы можете вернуться в состояние покоя или перейти в состояние столкновения. Перехода из состояния покоя в состояние столкновения нет. (Если оставаться в покое, столкновения не произойдёт.)

状态

Состояние можно объявить несколькими способами; самый простой способ — определить состояние только с одним id:

Код
                            
Копировать
Встраивание
stateDiagram-v2 stateId

Другой способ — использовать синтаксис state и добавить следующее описание:

Код
                            
Копировать
Встраивание
stateDiagram-v2 state "This is a state description" as s2

Ещё один способ определения состояния с описанием — сначала определить ID состояния, затем добавить двоеточие и описание:

Код
                            
Копировать
Встраивание
stateDiagram-v2 s2 : This is a state description

Переход

Переход — это соединительная линия, когда одно состояние входит в другое, обозначается текстовой стрелкой "-->".

Когда вы определяете переход между двумя состояниями, и состояние ещё не определено, неопределённое состояние будет определено с использованием id из перехода. После этого вы можете добавить описание для определённого таким образом состояния.

Код
                            
Копировать
Встраивание
stateDiagram-v2 s1 --> s2

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

Код
                            
Копировать
Встраивание
stateDiagram-v2 s1 --> s2: A transition

Начало и конец

Существует два особых состояния, обозначающих начало и остановку диаграммы. Эти два состояния обозначаются синтаксисом [*], и направление перехода к этому состоянию определяет, является ли оно начальным или конечным состоянием.

Код
                            
Копировать
Встраивание
stateDiagram-v2 [*] --> s1 s1 --> [*]

Составное состояние

При использовании диаграмм состояний в реальном мире вы часто сталкиваетесь с многомерными диаграммами, поскольку состояние может иметь несколько внутренних состояний; это называется составным состоянием.

Чтобы определить составное состояние, вам нужно использовать синтаксис state, за которым следует id, и записать тело составного состояния в фигурных скобках {}. Вы можете назвать составное состояние на отдельной строке так же, как определяете простое состояние. См. пример ниже:

Код
                            
Копировать
Встраивание
stateDiagram-v2 [*] --> First state First { [*] --> second second --> [*] } [*] --> NamedComposite NamedComposite: Another Composite state NamedComposite { [*] --> namedSimple namedSimple --> [*] namedSimple: Another simple }

Вы можете работать на нескольких уровнях:

Код
                            
Копировать
Встраивание
stateDiagram-v2 [*] --> First state First { [*] --> Second state Second { [*] --> second second --> Third state Third { [*] --> third third --> [*] } } }

Вы также можете определять переходы между составными состояниями:

Код
                            
Копировать
Встраивание
stateDiagram-v2 [*] --> First First --> Second First --> Third state First { [*] --> fir fir --> [*] } state Second { [*] --> sec sec --> [*] } state Third { [*] --> thi thi --> [*] }

Примечание: нельзя определять переходы между внутренними состояниями, принадлежащими разным составным состояниям.

Выбор

Иногда вам нужно смоделировать выбор между двумя или более путями; это можно реализовать с помощью <<choice>>.

Код
                            
Копировать
Встраивание
stateDiagram-v2 state if_state <<choice>> [*] --> IsPositive IsPositive --> if_state if_state --> False: if n < 0 if_state --> True : if n >= 0

Разветвление/слияние

Можно использовать <<fork>> <<join>> для указания разветвления/слияния на диаграмме.

Код
                            
Копировать
Встраивание
stateDiagram-v2 state fork_state <<fork>> [*] --> fork_state fork_state --> State2 fork_state --> State3 state join_state <<join>> State2 --> join_state State3 --> join_state join_state --> State4 State4 --> [*]

Примечание

Использование комментариев на диаграмме состояний позволяет выразить мысль более ясно; можно разместить комментарий справа или слева от узла.

Код
                            
Копировать
Встраивание
stateDiagram-v2 State1: The state with a note note right of State1 Important information! You can write notes. end note State1 --> State2 note left of State2 : This is the note to the left.

Параллелизм

Как и в plantUml, вы можете задать параллелизм с помощью символа дефиса --.

Код
                            
Копировать
Встраивание
stateDiagram-v2 [*] --> Active state Active { [*] --> NumLockOff NumLockOff --> NumLockOn : EvNumLockPressed NumLockOn --> NumLockOff : EvNumLockPressed -- [*] --> CapsLockOff CapsLockOff --> CapsLockOn : EvCapsLockPressed CapsLockOn --> CapsLockOff : EvCapsLockPressed -- [*] --> ScrollLockOff ScrollLockOff --> ScrollLockOn : EvScrollLockPressed ScrollLockOn --> ScrollLockOff : EvScrollLockPressed }

Настройка направления диаграммы

Для диаграммы состояний вы можете использовать оператор направления для настройки направления рендеринга диаграммы, как показано в этом примере.

Код
                            
Копировать
Встраивание
stateDiagram direction LR [*] --> A A --> B B --> C state B { direction LR a --> b } B --> D

Комментарий

В диаграмму состояний можно вводить комментарии, которые редактор игнорирует. Комментарий должен начинаться с двойного знака процента (%%); весь текст от этого маркера до следующего символа перевода строки считается комментарием, включая любой синтаксис диаграммы. Комментарий может занимать отдельную строку или находиться в конце оператора.

Код
                            
Копировать
Встраивание
stateDiagram-v2 [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*]

Настройка стиля с помощью classDefs

Текущие ограничения classDef для диаграммы состояний:

1. Нельзя применять к начальному или конечному состоянию

2. Нельзя применять к составному состоянию или внутри составного состояния

Вы можете использовать синтаксис classDef (сокращение от class definition, где «class» аналогичен классу в CSS) для определения стилей. После classDef идёт имя стиля, затем одно или несколько «свойство-значение», каждое из которых состоит из допустимого имени свойства CSS, двоеточия (:) и соответствующего значения.

Ниже приведён пример classDef только с одним «свойство-значение»:

                            
Копировать
Встраивание
classDef movement font-style:italic;
  • Имя стиля — movement
  • Единственное свойство — font-style, значение — italic

Если вы хотите иметь несколько «свойство-значение», можно поставить запятую (,) между каждой парой «свойство-значение».

Ниже приведён пример, содержащий три пары «свойство-значение»:

                            
Копировать
Встраивание
classDef badBadEvent fill:#f00,color:white,font-weight:bold,stroke-width:2px,stroke:yellow
  • Имя стиля — badBadEvent
  • Первое свойство — fill, его значение — #f00
  • Второе свойство — color, его значение — white
  • Третье свойство — font-weight, его значение — bold
  • Четвёртое свойство — stroke-width, его значение — 2px
  • Пятое свойство — stroke, его значение — yellow

Применение стиля classDef к состоянию

Существует два способа применения стиля classDef к состоянию:

  • Применить стиль classDef к одному или нескольким состояниям в одном операторе с помощью синтаксиса class
  • Применить стиль classDef с помощью оператора :::, когда состояние используется в операторе перехода (например, со стрелкой, указывающей на другое состояние или от него)

1. Оператор class

Оператор class сообщает Mermaid о необходимости применить указанный classDef к одному или нескольким классам. Формат таков:

                            
Копировать
Встраивание
class [one or more state names, separated by commas] [name of a style defined with classDef]

Ниже приведён пример применения стиля badBadEvent к состоянию с именем Crash:

                            
Копировать
Встраивание
class Crash badBadEvent

Ниже приведён пример применения стиля movement к двум состояниям Moving и Crash:

                            
Копировать
Встраивание
class Moving,Crash movement

Вот пример. Обратите внимание, что к состоянию Crash применены два стиля classDef: movement и badBadEvent

Код
                            
Копировать
Встраивание
stateDiagram direction TB accTitle: This is the accessible title accDescr: This is an accessible description classDef notMoving fill:white classDef movement font-style:italic classDef badBadEvent fill:pink,color:white,font-weight:bold,stroke-width:2px,stroke:yellow [*]--> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*] class Still notMoving class Moving, Crash movement class Crash badBadEvent class end badBadEvent

2. Применение стиля к состоянию с помощью оператора :::

Вы можете применить стиль classDef к состоянию с помощью оператора :::. Синтаксис таков:

                            
Копировать
Встраивание
[state]:::[style name]

Вы можете применить его в операторе, использующем класс; это включает начальное и конечное состояния. Например:

Код
                            
Копировать
Встраивание
stateDiagram direction TB accTitle: This is the accessible title accDescr: This is an accessible description classDef notMoving fill:white classDef movement font-style:italic; classDef badBadEvent fill:pink,color:white,font-weight:bold,stroke-width:2px,stroke:yellow [*] --> Still:::notMoving Still --> [*] Still --> Moving:::movement Moving --> Still Moving --> Crash:::movement Crash:::badBadEvent --> [*]

Пробелы в имени состояния

Сначала можно определить состояние с помощью id, а затем, ссылаясь на этот id, добавить пробелы в состояние.

В следующем примере есть состояние с ID yswsii, описанное как «Your state with spaces in it». После определения yswsii используется в первом переходе диаграммы ([*] --> yswsii), а также используется при переходе к YetAnotherState (yswsii --> YetAnotherState). Для yswsii задан стиль, отличающий его от других состояний.

Код
                            
Копировать
Встраивание
stateDiagram classDef yourState font-style:italic,font-weight:bold,fill:white yswsii: Your state with spaces in it [*] --> yswsii:::yourState [*] --> SomeOtherState SomeOtherState --> YetAnotherState yswsii --> YetAnotherState YetAnotherState --> [*]