假设我嵌套了这样的Elmish组件:A
包含B
包含C
。
然后,如果C
具有状态和消息,则必须将它们从C
传递到B
,然后传递到A
。
例如,B
的消息和模型类型可能是:
type Message =
| CMessage of C.Message
| UpdateFoo of string
type Model =
{
Foo : string
C : C.Model
}
然后update
的{{1}}会进行一些路由:
B
然后必须对let update message model =
match message with
| CMessage m ->
{
model with
C = C.update m model.C
}
| UpdateFoo foo -> { model with Foo = foo }
消耗A
消息执行相同的操作。
例如,与B
相比,这很冗长。
在Elmish中管理此策略有哪些策略?
答案 0 :(得分:0)
如果创建模型类型的层次结构,则需要在update
中通过该层次结构路由消息。如果您不想通过update
中的该层次结构路由消息,则不要创建模型类型的层次结构。那将意味着您拥有一个平面模型。
但是,我认为拥有扁平模型是无法持续的。随着应用程序复杂性的增长,您将需要通过将相关概念分组到包含其自身模型类型的(子)模块中来管理这种复杂性。
例如,与
setState
相比,这很冗长。在Elmish中管理此策略有哪些策略?
函数setState
是meant for library authors。您的问题是关于特定的模型和消息类型的,所以我的印象是您是Elmish的“最终用户”(而不是库作者)。因此,我认为将示例update
函数与使用setState
的替代方法进行比较是不公平的,因为您应该使用setState
。
我认为您所描述的冗长是严格控制突变的权衡。通过使用Elmish,您是说要严格控制突变(通过让突变几乎全部发生在Elmish中而不是在代码中发生),因此我认为这种冗长是必要的。