避免在Elmish中嵌套样板?

时间:2019-06-13 11:16:15

标签: f# elmish

假设我嵌套了这样的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中管理此策略有哪些策略?

1 个答案:

答案 0 :(得分:0)

如果创建模型类型的层次结构,则需要在update中通过该层次结构路由消息。如果您不想通过update中的该层次结构路由消息,则不要创建模型类型的层次结构。那将意味着您拥有一个平面模型。

但是,我认为拥有扁平模型是无法持续的。随着应用程序复杂性的增长,您将需要通过将相关概念分组到包含其自身模型类型的(子)模块中来管理这种复杂性。

  

例如,与setState相比,这很冗长。在Elmish中管理此策略有哪些策略?

函数setStatemeant for library authors。您的问题是关于特定的模型和消息类型的,所以我的印象是您是Elmish的“最终用户”(而不是库作者)。因此,我认为将示例update函数与使用setState的替代方法进行比较是不公平的,因为您应该使用setState

我认为您所描述的冗长是严格控制突变的权衡。通过使用Elmish,您是说要严格控制突变(通过让突变几乎全部发生在Elmish中而不是在代码中发生),因此我认为这种冗长是必要的。