代码之家  ›  专栏  ›  技术社区  ›  Mulan

如何与ELM中的多态子组件进行通信?

  •  1
  • Mulan  · 技术社区  · 6 年前

    我的主程序有一个 update 功能

    update : Msg -> Model -> ( Model, Cmd Msg )
    

    为了与子组件通信,我们可以添加另一个变量并将消息包装为新消息。

    type alias Model =
        { ...
        , child : Child.Model
        }
    
    type Msg
        = ...
        | ChildMsg Child.Msg
    
    update msg model =
        case msg of
            ...
    
            ChildMsg childMsg ->
              let
                  ( childModel, cmd ) =
                      Child.update childMsg model.child
    
                  updatedModel =
                      { model | child = childModel }
    
                  childCmd =
                    Cmd.map ChildMsg cmd
              in
                   ( updatedModel, childCmd )
    

    但是,如果子组件的类型 更新 函数与父级不匹配。考虑一个具有多态更新函数的孩子:

    -- PolymorphicChild.elm
    
    update : Msg a -> Model -> ( Model, Cmd (Msg a) )
    

    从这个模块运行命令时,我必须包装它

    PolymorphicChild.someCommand : Cmd (Msg Foo)
    
    PolymorphicChild.someCommand
      |> Cmd.map PolymorphicChild
    

    但是,这会产生一个 Msg (PolymorphicChild.Msg Foo) ,而不是 Msg PolymorphicChild.Msg 我的应用程序正在等待。

    The right side of (|>) is causing a type mismatch.
    
    (|>) is expecting the right side to be a:
    
        Cmd (PolyMorphicChild.Msg Foo) -> a
    
    But the right side is:
    
        Cmd Polymorphic.Msg -> Cmd Msg
    

    我试着将一个多态参数添加到 App.Msg

    -- App.elm
    
    type Msg a =
       = ..
       | PolymorphicChildMsg (PolymorphicChild.Msg a) 
    

    但它基本上摧毁了我的整个计划。涉及的每个功能 应用程序消息 需要以某种方式更改以使用新的子组件。

    如何统一这两种类型并使两个组件协同工作?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Chad Gilbert    6 年前

    Msg Msg a Author Category Post Tag

    LoadInfo a

    type alias LoadInfo a =
        { worker : Worker a
        , url : Url
        , result : Result Http.Error ( Int, List a )
        }
    
    type Msg
        = LoadPost (LoadInfo Post)
        | LoadCategory (LoadInfo Category)
        | LoadTag (LoadInfo Tag)
        | LoadAuthor (LoadInfo Author)
    
    推荐文章