在 Elm 中使用小部件列表进行组合时处理消息

Handling messages when composing with list of widgets in Elm

在少数guides中,父组件中的消息处理是这样的;

type Msg
    = NavMsg Nav.Msg
    | SidebarMsg Sidebar.Msg
    | WidgetMsg Widget.Msg

父组件在更新中处理它们:

update : Msg -> AppModel -> (AppModel, Cmd Msg)
update message model =
    case message of
        WidgetMsg subMsg ->
            let
                (updatedWidgetModel, widgetCmd) =
                    Widget.update subMsg model.widgetModel
            in
                ({ model | widgetModel = updatedWidgetModel }, Cmd.map WidgetMsg widgetCmd)
        _ ->

但是,如果子组件在列表中,我找不到一种简单的方法来执行相同的操作。我怎样才能告诉正确的子组件对发给他的消息做出反应?

我想到了将组件对象添加到消息中:

type Msg
    = MessageToParent
    | MessageToChild Child Child.Msg

但是如果 Child 组件很大,这似乎非常低效,并且在尝试将内部 Child.Msg 委托给右侧 Child 时仍然给我带来麻烦 Child

处理传递给组件列表的消息的最佳方式是什么?

我建议使用数组(或字典)和这样的代码

type Msg
    = WidgetMsg Int Widget.Msg

update : Msg -> AppModel -> (AppModel, Cmd Msg)
update message model =
    case message of
        WidgetMsg idx subMsg ->
            model.widgetModels
                |> Array.get idx
                |> Maybe.map (Widget.update subMsg)
                |> Maybe.map (\(m,c) -> 
                     ({ model | widgetModels = Array.set idx m model.widgetModels }
                     , Cmd.map Widgetmsg idx c)
                     )
                |> Maybe.withDefault (model, Cmd.none)
        _ ->