This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
State和Action
前置知识
这里涉及到很多的ts语法,注意参考线上文档:【TypeScript】TS中常见的9种操作符&运算符(八)_ts 操作符-CSDN博客
什么是State
State是实体的一种属性,通常表示一种状态,比如以下:
- 一篇文章的发布状态(1
- 未发布,已发布,已撤回
- 一篇文章的置顶状态(2
- 已置顶,未置顶
- 评论的申请状态(3
- 待提交,已提交,通过,未通过
- 等等等等
如何定义一个State
了解:在传统开发模式下
在传统的前后端开发模式下,我们实际上认为一类State其实就是这个数据库表中的一个字段,比如
- 看(1
- 实际上是文章中的publishState这个字段,取值是枚举
- 看(2
- 实际上是文章中的isTop这个字段,取值可以是boolean
- 看(3
- 实际上是评论的applyState这个字段,取值是枚举
比如我们在Demo项目中的Essay实体中,就有这么一个属性:
这就是一种传统的定义方式,在实体的属性中添加isTop这个字段,然后去调用update去更新这个属性
在Oak框架中定义一个State(需要熟悉)
我们只需要在实体定义中,导出一个类型,里面去定义状态值的枚举即可,如下:
什么是Action
在oak框架中,Action其实就是用户的行为(具体的某一个业务行为),比如用户对你的文章点赞,用户对你进行关注。
这些一般情况下会表现为前端的一个按钮,我所定义的按钮点击之后的行为,就是一个Action
在Oak中编写一个Action
- Action的编写与State类似,如下:
State和Action相结合,实现状态转移
- 前面我们提到了State和Action,我们很容易发现,一般情况下,通常都是一个或者多个State下,可以执行某一项Action,从而使当前的State转换为另一个State(这里需要理解一下,就比如点击发布按钮之后从
未发布变成已发布,同理在已撤回的文章上点击发布按钮,也可以转换为已发布) - 举个例子:
- 一篇文章的置顶与否
- 初始状态为
未置顶 - 执行名为setTop的Action之后,会从
未置顶->已置顶 - 执行名为cancelTop的Action之后,会从
已置顶->未置顶
- 初始状态为
- 一篇文章的置顶与否
- 这里的文章置顶状态是一套State,文章的setTop和cancelTop是一套Action,他们之间是强关联的,可以说这一套的State和Action就是相伴而生的,我的Action就是为了转换State的值,而State的值又限制了到底能执行哪个Action。
在Oak框架中定义这种状态转移
-
不难得知,我们定义State和Action的关联,需要以下这几个值
- 初始状态(Initial state)
- 转移矩阵(State transition matrix)
- 前一个状态 ---一个具体行为---> 后一个状态
- 前一个状态 ---一个具体行为---> 后一个状态
- 前一个状态 ---一个具体行为---> 后一个状态
-
所以我们就以下面的形式进行定义:
-
注意这里的Action和State具有一定的命名规范,具体的规范是这样的:
-
Action的名称必须为xxxAction,以大写开头
-
State的名称必须为xxxState,以大写开头
-
转移方程的定义中,export const的变量名必须是:xxxActionDef,xxx以大写开头
在entity中应用这个状态
当我们定义完这个State之后,别忘了在EntityDesc中引用这个具体的状态信息,其会被作为entity的属性之一
State和Action组合写法的优势
- 避免了根据state去检查action的Checker的编写。
- 避免了action相关的Trigger的编写。
- 统一了行为的名称和State的检查
- 统一的Action的定义颜色和不同State的状态名称以及颜色
小任务
现在项目中的Essay实体中的isTop属性,还是传统的属性定义方式,并且编写了checker和trigger去实现,还有一些projection用到了这个属性。
现在请你将Essay实体中的isTop属性删除,修改为State和Action的定义形式。





