Skip to content

状态图

"状态图是一种用于计算机科学及相关领域的图表,用于描述系统的行为。状态图要求所描述的系统由有限数量的状态组成;有时确实如此,而其他时候这是一个合理的抽象。" 维基百科

Mermaid 可以渲染状态图。语法尝试与 plantUml 中使用的语法兼容,这将使用户更容易在 Mermaid 和 plantUml 之间共享图表。

旧版渲染器:

在状态图中,系统通过状态以及一个状态如何通过转换变为另一个状态来描述。上面的示例图显示了三个状态:静止移动碰撞。你从静止状态开始。从静止状态,你可以转换到移动状态。从移动状态,你可以转换回静止状态或转换到碰撞状态。没有从静止状态到碰撞状态的转换。(如果你静止不动,你就不会碰撞。)

状态

状态可以通过多种方式声明。最简单的方法是仅使用id定义状态:

另一种方法是使用状态关键字和描述,如下所示:

另一种定义带有描述的状态的方法是定义状态ID,后跟冒号和描述:

过渡

过渡是指一个状态转变为另一个状态时的路径/边。这通常使用文本箭头“-->”来表示。

当你在两个状态之间定义过渡,而这些状态尚未定义时,未定义的状态将使用过渡中的ID进行定义。你可以稍后为以这种方式定义的状态添加描述。

可以在过渡中添加文本来描述它所代表的内容:

开始和结束

有两个特殊状态表示图的开始和结束。这些状态使用[*]语法编写,并且向它的转换方向定义了它是开始状态还是结束状态。

复合状态

在实际使用状态图时,你经常会遇到多维的图表,因为一个状态可能有多个内部状态。在这个术语中,这些被称为复合状态。

为了定义一个复合状态,你需要使用state关键字,后跟一个id和复合状态的主体,主体放在{}之间。你可以像简单状态一样在单独的一行上命名复合状态。请参见下面的示例:

你可以在多个层次上做到这一点:

你也可以在复合状态之间定义过渡:

你不能定义属于不同复合状态的内部状态之间的转换

选择

有时你需要在两个或多个路径之间做出选择,你可以使用<>来实现。

分支

可以在图中使用<> <>来指定一个分支。

注释

有时候,没有什么比便利贴更能表达清楚了。在状态图中也是如此。

在这里,您可以选择将注释放在节点的右侧左侧

并发

与在plantUml中一样,您可以使用--符号来指定并发性。

设置图表的方向

使用状态图时,您可以使用方向语句来设置图表的渲染方向,如本例所示。

评论

可以在状态图图表中输入注释,这些注释将被解析器忽略。注释需要单独成行,并且必须以%%(双百分号)开头。从注释开始到下一个换行符之间的任何文本都将被视为注释,包括任何图表语法

使用classDefs进行样式设置

与其他图表(如流程图)一样,您可以在图表本身中定义一个样式,并将该命名样式应用于图表中的一个或多个状态。

以下是状态图类定义的当前限制:

  1. 不能应用于开始或结束状态
  2. 不能应用于或包含在复合状态中

这些功能正在开发中,将在未来的版本中提供。

您使用classDef关键字定义一个样式,这是“类定义”的缩写(其中“类”类似于CSS类),后面跟着样式的名称,然后是一个或多个属性-值对。每个属性-值对是一个有效的CSS属性名称,后面跟着一个冒号(:),然后是一个值。

这是一个只有一个属性-值对的classDef示例:

txt
classDef movement font-style:italic;

其中

  • 样式的名称movement
  • 唯一的属性font-style,其italic

如果你想要有多个属性-值对,那么你需要在每个属性-值对之间加上逗号(,)。

这是一个包含三个属性-值对的示例:

txt
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样式应用于状态:

  1. 使用class关键字将classDef样式应用于单个语句中的一个或多个状态,或者
  2. 使用 ::: 操作符在转换语句中应用 classDef 样式到状态(例如,使用箭头指向/来自另一个状态)

1. class 语句

一个 class 语句告诉 Mermaid 将命名的 classDef 应用到一个或多个类。形式如下:

txt
class [one or more state names, separated by commas] [name of a style defined with classDef]

这是一个将badBadEvent样式应用于名为Crash状态的示例:

txt
class Crash badBadEvent

以下是将movement样式应用于两个状态MovingCrash的示例:

txt
class Moving, Crash movement

这里是一个展示使用示例的图表。请注意,Crash状态应用了两个classDef样式:movementbadBadEvent

2. ::: 操作符用于将样式应用于状态

你可以使用:::(三个冒号)操作符将classDef样式应用于状态。语法是

txt
[state]:::[style name]

你可以在语句中使用类来在图表中使用这个。这包括开始和结束状态。例如:

州名中的空格

可以通过首先使用id定义状态,然后在以后引用该id来向状态添加空格。

在以下示例中,有一个状态,其ID为yswsii,描述为Your state with spaces in it。定义后,yswsii在图表中的第一个转换([*] --> yswsii)以及到YetAnotherState的转换(yswsii --> YetAnotherState)中使用。(yswsii已被样式化,使其与其他状态不同。)